EntityManager는 onetomany 주석을 추가 할 때 JPA/Hibernate를 사용하여 인스턴스화하지 못합니다.
-
20-09-2019 - |
문제
나는 내가 추가 할 때 인디티 메너를 인스턴스화 할 수 없다는 데 어려움을 겪고있다. 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을 가지고 있습니다. 각 행은 사람에게 고유하지만 사용자 이름이 부여 된 모든 교육 정보를로드 할 수 있기를 원합니다.
그것은 위와 상충됩니다. 당신은 몇 가지를 가질 수 있습니다 EducationInfo
당 User
또는 "사람에게 독특합니다".