@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
上使用Set
和HashSet
(就像Augustin说的那样)修复了问题。