我应该在AutoPopulatingList上使用哪个JPA注释?

时间:2013-07-03 10:25:10

标签: sql-server spring hibernate jpa hsqldb

我有一个名为ReferenceForm的实体,它包含一个ReferenceItems的AutoPopulatingList。它看起来像这样:

@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添加注释,则hibernate创建的字段类型为varbinary(255)。这会导致字符串截断错误。为了解决这个问题,我使用了@lob注释。这在当时是值得怀疑的,但它运作良好。此时我只是使用HSQLDB。

现在应用程序需要针对MSSQL运行。我使用Hibernate生成了模式,而referenceItems是ReferenceForm表上的image列。项目本身存储在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准确描述了关系的本质
  • 定义字段时,使用接口(List)代替实现。请参阅http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html
  • 定义CascadeType,否则在保存实体时会出现此错误: org.hibernate.TransientObjectException:object引用未保存的瞬态实例
  • 使FetchType为EAGER,否则您无法在不同的事务中加载表单:出现此错误:无法懒惰地初始化角色集合:ReferenceForm.referenceItems,无法初始化代理 - 无会话 < / LI>

2 个答案:

答案 0 :(得分:1)

您应该用@Lob替换@OneToMany年代,并将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

答案 1 :(得分: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准确描述了关系的本质

  • 定义时使用接口(List)代替实现 场。看到 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html

  • 定义CascadeType,否则在保存时会出现此错误 entity:org.hibernate.TransientObjectException:object引用一个 未保存的瞬态实例

  • 否则请使FetchType为EAGER 无法在不同的事务中加载表单:出现此错误: 懒得初始化角色集合: ReferenceForm.referenceItems,无法初始化代理 - 无会话