我一直在努力,因爲我無法將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完全和問題走了。上關聯的另一側
您是否能夠打印出實際的錯誤/堆棧痕跡?唯一看起來有些腥意的是'@ OneToOne'從'EducationInfo'到'Address',但它不應該是一個問題,因爲它是通過FK映射的。 「地址」是否有任何'@ OneToOne'映射?獲得Hibernate的錯誤信息是最重要的,它會告訴你在哪裏尋找錯誤。 – ChssPly76 2009-12-23 03:14:29
我希望我能得到堆棧跟蹤,但我不明白該如何得到它。 – 2009-12-23 03:47:15
我剛剛注意到(註解在Scala中看起來有點不同),您沒有在@OneToMany上設置'mappedBy'。您應該:'mappedBy =「user」' - 這意味着該關聯由'EducationInfo'表保存。 – ChssPly76 2009-12-23 04:32:32