我有一个名为 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 表上的一个图像列。项目本身存储在 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 references an unsaved transient instance
- 使 FetchType EAGER 否则您无法在不同的事务中加载表单:出现此错误:无法延迟初始化角色集合:ReferenceForm.referenceItems,无法初始化代理 - 无会话