Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@Hibernate 3.5中的OrderColumn注释_Hibernate_Jpa_Jpa 2.0_One To Many - Fatal编程技术网

@Hibernate 3.5中的OrderColumn注释

@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=

我试图在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=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();