2009-12-22 25 views
2

我一直在努力,因爲我無法將EntityManager實例化,因爲我將OneToMany列添加到已具有OneToMany列的類中。當我添加OneToMany註釋時,EntityManager無法使用JPA/Hibernate進行實例化

現在EducationInfo對用戶有一個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的是在每個測試空,因此它失敗。

更新3:

Address實體沒有外鍵的任何東西,因爲它是從幾個實體調用。

使用Apache Derby作爲數據庫可能導致此問題嗎?

很抱歉,我沒有收到任何錯誤消息。我在maven內部運行這個程序,儘管我每次都不知道發生了什麼錯誤,但我刪除了數據庫。來自EducationInfo的@ManyToOne - >用戶不會導致任何問題,但是@OneToMany - > UserInfo來自用戶。

UPDATE 4:

我添加了一個的mappedBy給用戶實體的建議。我在另一個列定義中有過,因爲我有五個定義不起作用,我相信它們都是出於同樣的原因,所以我只用一個來測試。不幸的是,它仍然會導致不會構建EntiyManagerFactory,因此所有測試都失敗。

最後更新:

實際情況是

不能同時讀取多個 袋

所以我剛剛從EducationInfo刪除FetchType完全和問題走了。上關聯的另一側

+0

您是否能夠打印出實際的錯誤/堆棧痕跡?唯一看起來有些腥意的是'@ OneToOne'從'EducationInfo'到'Address',但它不應該是一個問題,因爲它是通過FK映射的。 「地址」是否有任何'@ OneToOne'映射?獲得Hibernate的錯誤信息是最重要的,它會告訴你在哪裏尋找錯誤。 – ChssPly76 2009-12-23 03:14:29

+0

我希望我能得到堆棧跟蹤,但我不明白該如何得到它。 – 2009-12-23 03:47:15

+0

我剛剛注意到(註解在Scala中看起來有點不同),您沒有在@OneToMany上設置'mappedBy'。您應該:'mappedBy =「user」' - 這意味着該關聯由'EducationInfo'表保存。 – ChssPly76 2009-12-23 04:32:32

回答

3

OneToMany的補的映射是ManyToOne,它不能OneToOne。這就是導致EntityManager失敗的原因。

當您從User刪除的最後一行,因爲那麼你就只能用OneToMany留給Address,雖然這裏沒有顯示,想必Address沒有一個OneToOne鏈接User它的工作原理。

我不是斯卡拉專家;在Java中,當EntityManager無法初始化時,通常會顯示錯誤並顯示堆棧跟蹤;錯誤消息並不總是非常具有描述性,但通常會說明它與映射有什麼問題。也許你需要調整你的日誌設置,如果你沒有得到這個錯誤。

我不太明白你的模型:

基本上,用戶應該能夠 有幾個IP地址,所以我希望它 將成爲多對多,但每次使用 也可以有幾個教育信息實例 ,所以ManyToOne需要 。

這聽起來像是從@OneToMany到UserAddress我和(如果「使用」指的是「用戶」)作爲@OneToMany從UserEducationInfo

眼下EducationInfo有 OneToOne用戶,因爲每一行都會 是唯一的一個人,但我想 能夠加載所有得到一個用戶名教育 信息。

與上述衝突。要麼你可以有幾個EducationInfoUser或它是「一個人所獨有的」。

+0

地址確實有OneToOne鏈接,但我意識到地址可以共享。 謝謝你注意到錯字。 我會做出改變,看看會發生什麼。 – 2009-12-22 17:27:17

+0

它仍然是EducationInfo中用戶的OneToOne。這仍然需要ManyToOne – 2009-12-22 22:35:52

+0

我更新我的答案更改爲@ManyToOne,它仍然失敗。 – 2009-12-23 01:57:20

相關問題