@Hibernate 3.5中的OrderColumn注释
我试图在Hibernate 3.5中使用@Hibernate 3.5中的OrderColumn注释,hibernate,jpa,jpa-2.0,one-to-many,Hibernate,Jpa,Jpa 2.0,One To Many,我试图在Hibernate 3.5中使用@OrderColumn注释 @OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) @OrderColumn(name = "pos") private List<Children> childrenCollection; @OneToMany(mappedBy=“parent”,fetch=FetchType.EAGER,cascade=
@OrderColumn
注释
@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@OrderColumn(name = "pos")
private List<Children> childrenCollection;
@OneToMany(mappedBy=“parent”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@订单列(name=“pos”)
私人名单儿童收集;
检索数据时,一切正常。但我无法使其对列表中的元素重新排序并将新顺序保存到数据库。Hibernate不支持@OneToMany(mappedBy=“…”)和@OrderColumn的组合。此JIRA问题跟踪在使用此无效组合时抛出更明显错误消息的请求: 我认为这不受支持,主要是因为它是一种奇怪的关系模式。上面的注释表明,关系的“一”侧决定了如何将关系刷新到数据库中,但通过检查列表,顺序/位置仅在“多”侧可用。“多”一方拥有关系更有意义,因为这一方知道元素的成员资格和顺序 Hibernate注释文档详细描述了这种情况: 解决方法是删除“mappedBy”属性,这将导致关联使用默认的联接表策略,而不是目标表上的列。可以使用@JoinTable注释指定联接表的名称 这一变化的净影响是,关系的“多”方面现在决定了关系的持久化方式。java代码需要确保列表正确更新,因为Hibernate现在在刷新实体时将忽略“一方” 如果您仍然希望在Java中访问“一”端,请将其映射为
@ManyToOne
@JoinColumn(name="...", insertable=false, updatable=false, nullable=false)
您应该尝试在关联的所有者上指定OrderColumn。 或者在映射中,将所有者放在子级上,所有者应该是父级(在双向关联中,所有者是没有关键字mappedBy的所有者,这里您将此关键字放在父级的类上,那么您的意思是父级的类不是所有者) 在children类中,parentCollection上应该有关键字mappedBy。但不在儿童集合上。
在父类中,应该有注释@JoinTable,类似这样:
@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;
@OneToMany(mappedBy=“parent”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@订单列(name=“pos”)
@JoinTable(name=”“,joinColumns=@JoinColumn()
私人名单儿童收集;
执行以下操作:
@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);
}
}
}
@实体
班级家长{
@独身癖
@订单列(name=“pos”)
列出儿童名单;
}
@实体
班童{
@许多酮
父母;
@列(name=“pos”)
整数指数;
@预科生
@预更新
私有无效准备索引(){
如果(父项!=null){
index=parent.children.indexOf(this);
}
}
}
您能告诉我如何对列表重新排序并保存回数据库吗???我已尝试创建新的ArrayList和parent.setChildrenCollection(newList)我在检索到的列表上尝试过Collections.sort。我也尝试过从集合中删除空项。什么都没有发生。父项中的其他更改被保存到数据库中,但列表没有发生任何变化。Hibernate 3.5是否适用于JPA 1.0,@OrderColumn是JPA 2.0?!有趣的是,“官方”显式索引列的示例正好使用了组合@OneToMany(mappedBy=“…”)
+@OrderColumn
(参见中的示例7.8)。在回答此问题后,一致认为无论如何都必须支持这种情况。Gail Badner:“我同意应该支持@OneToMany(mappedBy=“…”)。”是否还有其他JPA提供商(像Eclipselink)支持@OneToMany(mappedBy=“…”)
?我天真的猜测是,每个提供者都支持这个,因为它是一个相当标准的映射。通常,Hibernate是唯一的例外。它基本上是JPA提供者下的IE6:(我不知道为什么这是一个“奇怪的关系模式”)我认为在prepareIndex()中应该改为index=parent.children.indexOf(this);if(index=-1)index=parent.children.size();