【问题标题】:@OrderColumn, @OneToMany & null index column for collection@OrderColumn、@OneToMany 和用于集合的空索引列
【发布时间】:2011-07-20 14:11:28
【问题描述】:

我正在尝试创建保留顺序的父子表。 Hibernate 文档中的示例 7.8 显示了如何执行此操作:

@Entity
public class Customer {
   @Id @GeneratedValue public Integer getId() { return id; }
   public void setId(Integer id) { this.id = id; }
   private Integer id;

   @OneToMany(mappedBy="customer")
   @OrderColumn(name="orders_index")
   public List<Order> getOrders() { return orders; }
   public void setOrders(List<Order> orders) { this.orders = orders; }
   private List<Order> orders;
}

@Entity
public class Order {
   @Id @GeneratedValue public Integer getId() { return id; }
   public void setId(Integer id) { this.id = id; }
   private Integer id;

   public String getNumber() { return number; }
   public void setNumber(String number) { this.number = number; }
   private String number;

   @ManyToOne
   public Customer getCustomer() { return customer; }
   public void setCustomer(Customer customer) { this.customer = customer; }
   private Customer number;
}

来自http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-indexed

当我尝试这个时,我得到一个错误: 集合的空索引列

Hibernate issue 描述了该问题并给出了一个无效的示例,但它明确表示我在上面从文档中给出的示例是有效的。

@Entity
public class Parent {
    @OneToMany(mappedBy="parent")
    @OrderColumn(name="order")
    private List<Child> children;
}

@Entity
public class Child {
    @ManyToOne
    private Parent parent;
}

来自:https://hibernate.onjira.com/browse/HHH-5390

也许我很密集,但我看不出这两个示例之间的区别。一种是:

@OneToMany(mappedBy="customer")
@OrderColumn(name="orders_index")

另一个是:

@OneToMany(mappedBy="parent")
@OrderColumn(name="order")

当然,我还没有弄清楚如何让 OrderColumn 工作。有谁知道为什么其中一个例子有效而另一个无效?

【问题讨论】:

    标签: java hibernate jpa jpa-2.0


    【解决方案1】:

    该错误指的是 Hibernate 3.5.3,而文档指的是 Hibernate 3.6。我从 cmets 了解到,HHH-5390 的问题已经解决。你使用哪个版本的休眠? 请注意,您必须在 @OrderCoulumn 中有一个具有确切指定名称的列。

    另请参阅discussion,了解相同的问题以及 3.5 的解决方法。


    更新

    显然它仍然不受支持,并且存在 HHH-5732 所述的文档错误。我从HHH-5390 认为分配它的人(拥有HHH-5390 的人)已同意修复它。但目前尚不清楚是否以及何时会发生。

    【讨论】:

    • 我使用的是 Hibernate 3.6.0。当我尝试按照该示例进行操作时,出现错误“集合的空索引列”。 jira 问题说它适用于 3.5.3 并且不会修复,所以我认为这不是 3.6 中修复的错误。该错误的评论说,该错误显示的内容无效,但文档中显示的内容相似但有效。
    • 显然这是一个文档错误,它仍然不受支持。查看我的更新。
    • 谢谢。使用此处的示例似乎可以实现相同的目标:docs.jboss.org/hibernate/stable/annotations/reference/en/…
    • 你好。我在使用地图时遇到了同样的问题。我没有任何@OrderColumn。而且我仍然收到此错误..我使我的 OneToMany 单向并且它有效。 (ps:在 EclipseLink 中从一开始就运行良好)
    【解决方案2】:

    对我来说,重点是将@OrderColumn 中声明的列设置为 NOT NULL 并且默认值为 0

    【讨论】:

    • 我一直到凌晨 2 点才试图解决这个问题。文档确实声明订单列必须为非空。啊!
    • 这将创建重复项
    • 这引入了一个问题,如果所有子行的 orderColumn 都设置为 0,休眠只返回其中的 1 个。
    【解决方案3】:

    做这样的事情:

    @Entity
    class Parent {
    
        @OneToMany
        @IndexColumn(name = "index_column")
        List<Child> children;
    }
    
    @Entity
    class Child {
    
        @ManyToOne
        Parent parent;
        @Column(name = "index_column")
        Integer index;
    
        @PrePersist
        @PreUpdate
        private void prepareIndex() {
            if (parent != null) {
                index = parent.children.indexOf(this);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      莫恩,

      同样的问题出现在 hibernate.core 5.1.4 final。在标签@OrderColumn 上使用SetHashSet(就像奥古斯丁所说的那样)可以解决问题。

      【讨论】:

        【解决方案5】:

        也许这些可以帮助你:

        我对带有标签 @IndexColumn 的旧版本 hibernate (3.5.6) 也有同样的问题,并找到一个好的非侵入性解决方法:尝试将您的 List&lt;Message&gt; 更改为 @987654323 @对象并使用HashSet 而不是ArrayList。 似乎旧的 Hibernate 版本更适合使用 Set。

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-15
          • 1970-01-01
          • 2019-07-06
          相关资源
          最近更新 更多