我正在尝试在@OrderColumnHibernate 3.5中使用注释
@OrderColumn
@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) @OrderColumn(name = "pos") private List<Children> childrenCollection;
检索数据时,一切正常。但是我无法使其重新排序列表中的元素并将新的订单保存到数据库中。
Hibernate不支持@OneToMany(mappedBy =“ …”)和@OrderColumn的组合。此JIRA问题跟踪使用此无效组合时引发更明显错误消息的请求:http : //opensource.atlassian.com/projects/hibernate/browse/HHH-5390
我认为主要由于它是一种奇怪的关系模式而不受支持。上面的注释指示关系的“一个”侧确定如何将关系刷新到数据库,但是通过检查列表,顺序/位置仅在“许多”侧可用。“多”方拥有该关系更有意义,因为该方既了解元素的隶属关系又了解元素的顺序。
Hibernate Annotations文档详细描述了这种情况:
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity- hibspec-collection-extratype- indexbidir
解决方法是删除“ mappedBy”属性,这将导致关联使用默认的联接表策略而不是目标表上的列。您可以使用@JoinTable批注指定连接表的名称。
此更改的最终结果是,关系的“许多”端现在确定了如何保持关系。您的Java代码需要确保List正确更新,因为Hibernate现在在刷新实体时将忽略“一侧”。
如果您仍然想用Java访问“一侧”,请使用
@ManyToOne @JoinColumn(name="...", insertable=false, updatable=false, nullable=false)