2013-07-03 44 views
1

我有一個名爲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,無法初始化代理 - 沒有會話

回答

0

感謝Willome使用@OneToMany建議。最後,這是有效的。

//從

@lob 
private AutoPopulatingList<ReferenceItem> referenceItems; 

//到

@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,無法初始化代理 - 無會話

1

你應該用@OneToMany和replac取代你@Lob annonation e AutoPopulatingList將集合值字段聲明爲接口類型(請參閱主題6.1。此鏈接http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html關於持久性集合。)

//@Lob 
@OneToMany(mappedBy = "referenceForm") 
private AutoPopulatingList<ReferenceItem> referenceItems; //fail AutoPopulatingList is not an interface 

@OneToMany(mappedBy = "referenceForm") 
private Set<ReferenceItem> referenceItems; // OK with Set/Collection/List 
+0

感謝您的回覆。如果我在AutoPopulatingList上使用該註釋,則會看到以下錯誤:「org.hibernate.AnnotationException:非法嘗試將非集合映射爲@ OneToMany,@ ManyToMany或@ CollectionOfElements:」 –

+0

我將嘗試將該字段定義爲列出並看看會發生什麼然後 –

+0

好的,我認爲AutoPopulatingList擴展了Collection。請使用AutoPopulatingList實體更新您的問題。 – willome