EntityManager는 onetomany 주석을 추가 할 때 JPA/Hibernate를 사용하여 인스턴스화하지 못합니다.

StackOverflow https://stackoverflow.com/questions/1947627

문제

나는 내가 추가 할 때 인디티 메너를 인스턴스화 할 수 없다는 데 어려움을 겪고있다. OneToMany 이미 a OneToMany 열.

지금 EducationInfo a OneToOne 사용자에게는 각 행이 사람에게 고유하므로 사용자 이름이 부여 된 모든 교육 정보를로드 할 수 있기를 원합니다.

열을 추가 할 때 orm.xml 파일을 변경하지 않고 데이터베이스를 드롭하여 다시 만들 수 있습니다.

class User {
  @Id
  @GeneratedValue(){val strategy = GenerationType.AUTO}
  var id : Int = _

  @Column{val nullable = false, val length=32}
  var firstName : String = ""
  var lastName : String = ""

  @Column{val nullable = false, val unique = true, val length = 30}
  var username : String = ""

  @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL)}
  var address : java.util.List[Address] = new java.util.ArrayList[Address]()

  @OneToMany{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.ALL), val mappedBy="user"}
  var educationInfo : java.util.List[EducationInfo] = new java.util.ArrayList[EducationInfo]()

마지막 열을 포함하지 않으면 단위 테스트가 잘 작동하지만이를 포함하면 모든 단위 테스트가 실패합니다.

다음은 사용하려는 클래스 이며이 클래스의 단위 테스트는 잘 작동합니다.

@Entity
@Table{val name="educationinfo"}
class EducationInfo {
  @Id
  @GeneratedValue(){val strategy = GenerationType.AUTO}
  var id : Long = _

  @Column{val nullable = false, val length = 100}
  var name : String = "";

  @OneToOne{val fetch = FetchType.EAGER, val cascade = Array(CascadeType.PERSIST, CascadeType.REMOVE)}
  @JoinColumn{val name = "educationinfo_address_fk", val nullable = false}
  var location : Address = _

  @ManyToOne{val fetch = FetchType.LAZY, val cascade=Array(CascadeType.PERSIST)}
  @JoinColumn{val name = "educationinfo_user_fk", val nullable = false}
  var user : User = _

  @Column{val nullable = false, val length = 100}
  var degree : String = ""

  @Temporal(TemporalType.DATE)
  @Column{val nullable = true}
  var startyear : Date = new Date()
  var endyear : Date = new Date()

  @Column{val nullable = true, val length = 1000}
  var description : String = ""
}

EntityManager가 인스턴스화되는 것을 방지하는 오류가 무엇인지 알 수있는 방법이 있는지 궁금하지만, 주요 문제는이 열을 사용자에게 추가 할 때 문제를 일으킬 수 있는가?

업데이트:

오류가있는 부품을 제거했습니다.

UPDATE 2:

교육 기관의 사용자 열을 @ManyToOne 그리고 모든 단위 테스트가 실패했습니다.

내 오류 로그의 끝은 다음과 같습니다.

15035 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
15035 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
15047 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory
[PersistenceUnit: jpaweb] Unable to build EntityManagerFactory

그런 다음 EntityManager는 모든 테스트에서 NULL이므로 실패합니다.

3 : 업데이트 3.

그만큼 Address 엔티티는 여러 엔티티에서 호출되므로 외국 열쇠가 없습니다.

Apache Derby를 데이터베이스로 사용 하여이 문제가 발생할 수 있습니까?

불행히도 오류 메시지가 없습니다. 나는 이것을 Maven 내에서 실행하고, 그것이 무엇인지 알 수 없을 때마다 데이터베이스를 삭제하지만 그것이 잘못된 일을 알 수 없습니다. EducationInfo-> 사용자의 @ManyToOne은 문제를 일으키지 않지만 사용자의 @onetomany-> EducationInfo는 그렇습니다.

UPDATE 4:

제안 된대로 사용자 엔티티에 Mappedby를 추가했습니다. 나는 다른 열 정의에서 작동하지 않는 다섯 가지 정의가 있기 때문에 그것을 가지고 있었고, 그것들이 모두 같은 이유로 믿기 때문에 단지 하나로 테스트하고 있습니다. 불행히도 여전히 EntiymanagerFactory가 구축되지 않아 모든 테스트가 실패합니다.

최종 업데이트 :

실제 사례는있었습니다

여러 가방을 동시에 가져올 수 없습니다

그래서 나는 방금 EducationInfo에서 FetchType를 완전히 제거했고 문제가 사라졌습니다.

도움이 되었습니까?

해결책

OneToMany협회의 다른쪽에 대한 보완 매핑은 다음과 같습니다. ManyToOne, 그것 할 수 없습니다 ~이다 OneToOne. 그것이 원인입니다 EntityManager 실패.

마지막 줄을 제거 할 때 작동합니다 User 그렇다면 당신은 단지 남았습니다 OneToMany 에게 Address 그리고 여기에 표시되지는 않았지만 아마도 Address A가 없습니다 OneToOne 다음으로 연결 User.

나는 스칼라 전문가가 아닙니다. Java에서는 일반적으로 오류와 스택 추적이 인쇄됩니다. EntityManager 초기화에 실패; 오류 메시지는 항상 매우 설명적인 것은 아니지만 일반적으로 어떤 매핑이 문제가되는지 말합니다. 오류가 발생하지 않으면 로깅 설정을 조정해야 할 수도 있습니다.

나는 당신의 모델을 잘 이해하지 못했습니다.

기본적으로 사용자는 여러 주소를 가질 수 있어야하므로 많은 주소가 될 것으로 기대하지만 각 사용에는 여러 교육 정보가있을 수 있으므로 많은 사람들이 필요합니다.

@onetomany처럼 들립니다 User 에게 Address 나에게 @onetomany로 ""사용 "이"사용자 "를 의미하는 경우) User 에게 EducationInfo.

현재 EducationInfo는 사용자에게 onetoone을 가지고 있습니다. 각 행은 사람에게 고유하지만 사용자 이름이 부여 된 모든 교육 정보를로드 할 수 있기를 원합니다.

그것은 위와 상충됩니다. 당신은 몇 가지를 가질 수 있습니다 EducationInfoUser 또는 "사람에게 독특합니다".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top