我有一个名为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);
答案 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,无法初始化代理 - 无会话