Как исправить ошибку при создании бина с именем? - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать соединение Left Outer в моем проекте с использованием Hibernate и JPA. Однако после того, как я настроил все свои процедуры и написал код для присоединения, он выдает эту ошибку:

Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.model.AVSApplication.avsMapped

У меня есть идея, что она говорит мне, но я попытался обойти, но этопо-прежнему продолжает выдавать мне ту же ошибку. Я не верю, что это проблема со стороной базы данных, тогда я считаю, что это проблема либо с контроллером, либо с разделом сущности AVSApplicationn.class или AVSMapped.class.

AppRepository:

@Repository
public interface AppRepository extends JpaRepository<AVSMapped, String>{

    @Query("SELECT avs.appcode, avs.acro, avs.appname, mapped.gpStatus " 
            + "FROM avs LEFT JOIN mapped ON avs.appcode = mapped.appcode")
    List<ApplicationDTO> fetchAppDataLeftJoin();

}

JoinQueryService:

public class JoinQueryService {

    @Resource
    private AppRepository appRepository;


    public List<ApplicationDTO> getAppLeftJoin(){
        List<ApplicationDTO> list = appRepository.fetchAppDataLeftJoin();
        list.forEach(l-> System.out.println(l));
        return list;
    }

}

Контроллер:

@org.springframework.stereotype.Controller
public class AVSController {

        @Autowired
        private JoinQueryService joinQueryService;



      @GetMapping("/dept")
      public ResponseEntity<List<ApplicationDTO>> getAppLeftJoin(){
          return new ResponseEntity<List<ApplicationDTO>>(joinQueryService.getAppLeftJoin(), HttpStatus.OK);
      }

AVSApplication:


@Entity
@Table(name = "avs")
public class AVSApplication {

    @Id
    @Column(name = "appcode")
    private String appcode;

    @Column(name = "acro")
    private String acro;

    @Column(name = "appname")
    private String appname;


    @ManyToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "mGpStatus", insertable = false, updatable = false)
    @Fetch(FetchMode.JOIN)
    private AVSMapped avsMapped;

AVSMapped:

@Entity
@Table(name = "mapped")
public class AVSMapped  {

    @Id
    @Column(name = "mAppcode")
    private String mAppcode;

    @Column(name = "mAcro")
    private String mAcro;

    @Column(name = "mAppname")
    private String mAppname;

    @Column(name = "mGpStatus")
    private String mGpStatus;

    @OneToMany(targetEntity = AVSApplication.class, mappedBy ="appcode", orphanRemoval = false, fetch = FetchType.LAZY)
    private Set<AVSApplication> avsApplication;

ApplicationDTO:

public class ApplicationDTO {


    private String dtoAppCode;
    private String dtoAcro;
    private String dtoAppName;
    private String dtoGpStatus;

    //Constructor
    public ApplicationDTO(String dtoAppCode, String dtoAcro, String dtoAppName, String dtoGpStatus) {
        super();
        this.dtoAppCode = dtoAppCode;
        this.dtoAcro = dtoAcro;
        this.dtoAppName = dtoAppName;
        this.dtoGpStatus = dtoGpStatus;
        //this.dtoLastUpdate = dtoLastUpdate;
    }

ОбновленоОшибка:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field joinQueryService in com.controller.AVSController required a bean of type 'com.model.JoinQueryService' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.model.JoinQueryService' in your configuration.

1 Ответ

0 голосов
/ 11 октября 2019

Я вижу количество проблем во фрагменте.

@ManyToMany отображение в одном классе сущностей неверно. Это должно быть @ManyToOne

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mGpStatus", insertable = false, updatable = false)
@Fetch(FetchMode.JOIN)
private AVSMapped avsMapped;

JoinQueryService не может быть автоматически подключено в контроллере, если у вас не установлена ​​конфигурация @Bean. Аннотируйте свой класс с помощью аннотации Stereotype

@Service
public class JoinQueryService {
     ...
}

В репозитории JPA измените тип Generics с помощью Entity class

@Query("SELECT avs.appcode, avs.acro, avs.appname, mapped.gpStatus " 
        + "FROM avs LEFT JOIN mapped ON avs.appcode = mapped.appcode")
List<AVSMapped> fetchAppDataLeftJoin();
...