我正在尝试在Hibernate 3.5中使用@OrderColumn
注释。
@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@OrderColumn(name = "pos")
private List<Children> childrenCollection;
在检索数据时,一切都正常。但我无法重新排序列表中的元素并将新的顺序保存到数据库中。
我正在尝试在Hibernate 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注释文档对此情况进行了详细描述:
解决方法是移除"mappedBy"属性,这会导致关联使用默认的连接表策略而不是目标表上的列。您可以使用@JoinTable注释指定连接表的名称。@ManyToOne
@JoinColumn(name="...", insertable=false, updatable=false, nullable=false)
@OneToMany(mappedBy="...")
和 @OrderColumn
的组合(参见 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-indexed 中的示例7.8)。 - Chris Lercher@OneToMany (mappedBy="...")
的JPA提供者(例如Eclipselink)? - deamon可以这样做:
@Entity
class Parent {
@OneToMany
@OrderColumn(name = "pos")
List<Child> children;
}
@Entity
class Child {
@ManyToOne
Parent parent;
@Column(name = "pos")
Integer index;
@PrePersist
@PreUpdate
private void prepareIndex() {
if (parent != null) {
index = parent.children.indexOf(this);
}
}
}
@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@OrderColumn(name = "pos")
@JoinTable( name = "<NAME_OF_YOUR_TABLE>", joinColumns = @JoinColumn( <JOIN_COLUMNS_...> )
private List<Children> childrenCollection;