1

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

2 回答 2

1

您应该@Lob用 a 替换您的 annonation 并将AutoPopulatingList@OneToMany替换为声明为接口类型的集合值字段(查看主题 6.1。此链接上的持久集合http://docs.jboss.org/hibernate/core/3.3/参考/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
于 2013-07-03T12:29:27.227 回答
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,否则保存实体时出现此错误:org.hibernate.TransientObjectException: object references an unsaved transient instance

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

于 2013-07-17T08:49:15.183 回答