我有一個名爲ReferenceForm的實體,它包含一個AutoPopulatingList的ReferenceItems。它看起來像這樣:我應該在AutoPopulatingList上使用哪個JPA註釋?
@Entity
public class ReferenceForm implements Serializable{
private static final long serialVersionUID = -5633788166190438576L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
long id;
@lob
private AutoPopulatingList<ReferenceItem> referenceItems;
}
如果我根本不添加註釋到AutoPopulatingList,其休眠創建字段類型是VARBINARY(255)。這會導致字符串截斷錯誤。爲了解決這個問題,我使用了@lob註釋。這在當時感覺可疑,但它運行良好。在這一點上,我只是使用HSQLDB。
現在應用程序需要針對MSSQL運行。我已經使用Hibernate生成了模式,並且referenceItems是ReferenceForm表中的圖像列。項目本身存儲在ReferenceItem表中。
@lob是否在這裏適當的註釋?
編輯:ReferenceItem看起來是這樣的:
@Entity
public class ReferenceItem implements Serializable {
private static final long serialVersionUID = -9077063073733429102L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
long id;
private Title title;
private String firstName;
private String surname;
private String positionHeld;
private String institutionCompany;
@Embedded
private Address address;
@Embedded
private Telephone telephone;
private String email;
private boolean existingReference;
private String fileName;
public ReferenceItem() {
}
...getters and setters
}
第二個編輯:
感謝Willome使用@OneToMany建議。最後,這是有效的。
//from
@lob
private AutoPopulatingList<ReferenceItem> referenceItems;
//to
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<ReferenceItem> referenceItems = new AutoPopulatingList<ReferenceItem>(ReferenceItem.class);
- @OneToMany定義字段時準確地描述,而不是執行關係
- 使用接口(列表)的性質。見http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html
- 定義CascadeType的,否則就節省了實體出現此錯誤:org.hibernate.TransientObjectException:對象引用一個未保存的瞬態的實例
- 充分利用FetchType EAGER否則你無法加載的形式,不同的事務:出現此錯誤:未能懶洋洋地初始化角色的集合:ReferenceForm.referenceItems,無法初始化代理 - 沒有會話
感謝您的回覆。如果我在AutoPopulatingList上使用該註釋,則會看到以下錯誤:「org.hibernate.AnnotationException:非法嘗試將非集合映射爲@ OneToMany,@ ManyToMany或@ CollectionOfElements:」 –
我將嘗試將該字段定義爲列出並看看會發生什麼然後 –
好的,我認爲AutoPopulatingList擴展了Collection。請使用AutoPopulatingList實體更新您的問題。 – willome