代码之家  ›  专栏  ›  技术社区  ›  Piotr Gwiazda

@Hibernate3.5中的OrderColumn注释

  •  22
  • Piotr Gwiazda  · 技术社区  · 16 年前

    我试着用 @OrderColumn Hibernate 3.5注解

    @OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @OrderColumn(name = "pos")
    private List<Children> childrenCollection;
    

    3 回复  |  直到 7 年前
        1
  •  29
  •   Peter Centgraf    16 年前

    Hibernate不支持@OneToMany(mappedBy=“…”)和@OrderColumn的组合。此JIRA问题跟踪在使用此无效组合时抛出更明显错误消息的请求: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5390

    我认为这不受支持主要是因为它是一种奇怪的关系模式。上面的注释表明,关系的“one”侧决定了关系将如何刷新到数据库中,但是order/position只能通过检查列表在“many”侧可用。“许多”一方拥有这种关系更有意义,因为这一方既知道成员身份,也知道元素的顺序。

    Hibernate注解文档详细描述了这种情况:

    http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection-extratype-indexbidir

    这种变化的净影响是,关系的“多”方面现在决定了关系如何持久化。您的java代码需要确保正确更新列表,因为Hibernate现在在刷新实体时将忽略“一”面。

    @ManyToOne
    @JoinColumn(name="...", insertable=false, updatable=false, nullable=false)
    
        2
  •  10
  •   Daniel De León    14 年前

    @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);
            }
        }
    }
    
        3
  •  3
  •   Nico    15 年前

    您应该尝试在关联的所有者上指定OrderColumn。 或者在您的映射中,您将所有者放在子级上,所有者应该是父级(在双向关联中,所有者是没有关键字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;