@OrderColumn,@ OneToMany&null索引列用于收集

我正在尝试创建保留订单的父子表。 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 getOrders() { return orders; } public void setOrders(List orders) { this.orders = orders; } private List 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问题描述了这个问题,并给出了一个无效的例子,但是它明确地说我上面给出的文档中的例子是有效的。

 @Entity public class Parent { @OneToMany(mappedBy="parent") @OrderColumn(name="order") private List 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工作。 有没有人知道为什么其中一个例子有效而另一个不是?

该bug指的是Hibernate 3.5.3,而文档指的是Hibernate 3.6。 我从评论中了解到HHH-5390问题已得到解决。 你使用哪个版本的Hibernate? 请注意,您必须在@OrderCoulumn具有指定名称的@OrderCoulumn

另请参阅有关同一问题的讨论以及3.5的情况下的解决方法。


更新

显然它仍然不受支持,并且存在HHH-5732描述的文档错误。 我从HHH-5390那里得知,被分配的人(同样拥有HHH-5390的人)同意修理它。 但目前尚不清楚它是否以及何时会发生。

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

做这样的事情:

 @Entity class Parent { @OneToMany @IndexColumn(name = "index_column") List 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); } } } 

也许这些可以帮助你:

我对带有标记@IndexColumn的旧版本的hibernate(3.5.6)有同样的问题,并找到一个很好的非侵入性解决方法:尝试将List更改为Set Object并使用HashSet而不是ArrayList 。 老式的Hibernate版本似乎更适合使用Sets。

祝你好运!

莫因,

hibernate.core 5.1.4 final上也会出现同样的问题。 在标签@OrderColumn上使用SetHashSet (就像Augustin说的那样)修复了问题。