2009-12-22 3 views
2

OneToMany 열이 이미있는 클래스에 OneToMany 열을 추가 할 때 EntityManager를 인스턴스화 할 수 없다는 데 어려움을 겪고 있습니다.OneToMany 주석을 추가 할 때 EntityManager가 JPA/Hibernate를 사용하여 인스턴스 화하지 못함

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

열을 추가 할 때 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의 경우, 그래서 실패합니다.

UPDATE 3 : 그것은 여러 단체에서 호출로

Address 실체가 무엇이든에는 외래 키가 없습니다.

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

불행히도 오류 메시지가 표시되지 않습니다. 나는 이것을 Maven 내에서 실행하는데, 비록 그것이 일어난다는 것을 알 수 없을 때마다 나는 데이터베이스를 삭제한다. EducationInfo -> User의 @ManyToOne은 문제를 일으키지 않지만 User의 @OneToMany -> EducationInfo는 않습니다.

는 UPDATE 4 : 제안

나는 사용자 개체에 mappedBy을 추가했다. 나는 다른 컬럼 정의에서, 나는 작동하지 않을 다섯 가지 정의가 있었고, 나는 그들이 모두 같은 이유로 존재한다고 믿었 기 때문에 하나만 가지고 테스트했습니다. 불행히도 여전히 EntiyManagerFactory가 생성되지 않기 때문에 모든 테스트가 실패합니다.

최종 업데이트 :

는 실제 사건은

동시에 여러 가방 그래서 난 그냥 EducationInfo에서 완전히 FetchType을 제거

를 가져올 수 없습니다이었고, 문제는 멀리 갔다. 이 OneToOne을하지 수 연결의 반대편에

+0

실제 오류/스택 추적을 인쇄 할 수 있었습니까? 여기에 다소 생선이 보이는 것은'EducationInfo'에서'Address'까지의'@ OneToOne'이지만 FK를 통해 매핑되기 때문에 문제가되어서는 안됩니다. 'Address'는'@ OneToOne' 매핑을 가지고 있습니까? 여기서 Hibernate의 에러 메시지를 프린트하는 것이 가장 중요하다. 에러를 찾을 곳을 알려줄 것이다. – ChssPly76

+0

stacktrace를 얻을 수 있으면 좋겠지 만 얻는 방법을 모르겠습니다. –

+0

@OneToMany에'mappedBy'가 설정되어 있지 않다는 사실을 눈치 채 셨습니다 (주석은 스칼라에서 다소 다르게 보입니다). 'mappedBy = "user"'- 이는'EducationInfo' 테이블에 의해 연관이 유지된다는 것을 의미합니다. – ChssPly76

답변

3

OneToMany의 보수 매핑, ManyToOne입니다. 그것이 EntityManager을 실패하게 만드는 원인입니다.

여기에 도시되지는 않았지만 당신은 아마도 AddressUserOneToOne 링크가 없습니다, 당신은 AddressOneToMany 남아 있기 때문에 User에서 마지막 행을 제거 할 때 작동합니다.

저는 스칼라 전문가가 아닙니다. 자바에서는 보통 에러가 발생하고 EntityManager 초기화에 실패 할 때 스택 트레이스가 출력됩니다. 오류 메시지는 항상 매우 설명 적이지는 않지만 대개 어떤 매핑이 문제인지를 말합니다. 아마도 오류가 발생하지 않으면 로깅 설정을 조정해야 할 수도 있습니다.

는 기본적으로 사용자가 여러 주소를 가질 수 있어야한다, 그래서 나는 ManyToMany이 될 것으로 기대하지만, 각 도 여러 가지있을 수 있습니다 사용

꽤 모델을 이해하지 못했다 교육 정보의 인스턴스이므로 ManyToOne이 필요합니다. User에서 나에게 Address과 @OneToMany 같은 소리

(있는 경우 의미 "사용자", "사용") User에서 EducationInfo에 @OneToMany로합니다. 각 행은 사람에 고유 때문에

는 지금 EducationInfo는 사용자에게 OneToOne을 가지고,하지만 난 에 이름 주어진 모든 교육 정보를로드 할 수 싶어요.

위와 충돌합니다. User 당 여러 개의 EducationInfo 또는 "고유 한 사람"이있을 수 있습니다.

+0

주소에 OneToOne 링크가 있지만 주소를 공유 할 수 있음을 알게되었습니다. 오타를 발견해 주셔서 감사합니다. 나는 변화를보고 무슨 일이 일어나는 지 볼 것이다. –

+0

EducationInfo의 사용자는 여전히 OneToOne입니다. 그래도 ManyToOne이어야합니다 –

+0

@ManyToOne으로 변경된 답변을 업데이트했지만 여전히 실패합니다. –

관련 문제