我使用列表。该列表由一个复合主键组成,该复合主键也用于对列表进行排序。问题是,如果我删除列表中的一个元素(键复合),注释@OrderColumn会生成一个更新主键的请求,并且开销会增加一个类型的异常:
[26-05-2011 10:34:18:835] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1062, SQLState: 23000
[26-05-2011 10:34:18:835] ERROR org.hibernate.util.JDBCExceptionReporter -Duplicate entry '10-10' for key 'PRIMARY'
[26-05-2011 10:34:18:835] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 下面是映射的定义:
@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "chapter_item", joinColumns = { @JoinColumn(name = "chapter_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "item_id", nullable = false, updatable = false) })
@OrderColumn(name="iorder")
public List<Item> getItems() {
return items;
}下面是我遇到问题的update查询:
Hibernate:
update
chapter_item
set
item_id=?
where
chapter_id=?
and iorder=? 我想知道这是不是一个已知的bug,是否有人有解决方案?
发布于 2016-06-19 00:48:46
关于@OrderColumn,可以在http://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html上找到以下文档
指定用于维护列表的持久顺序的列。持久性提供程序负责在检索时和数据库中维护顺序。持久性提供程序负责在刷新到数据库时更新排序,以反映影响列表的任何插入、删除或重新排序。
因此,我们看到持久性提供者,即hibernate,负责更新名为iorder的列。也有人说:
在OneToMany或ManyToMany关系或元素集合上指定OrderColumn批注。OrderColumn注释是在引用要排序的集合的关系一端指定的。order列作为实体或可嵌入类的状态的一部分不可见。
请注意下面这句话:
作为实体或可嵌入类的状态的一部分,order列不可见。
因此,我建议您不要为@OrderColumn选择列iorder,因为它是您的composite key的一部分,并且当您在列表(List<Item>)中删除或插入元素时,hibernate肯定会更新此值。
霍普,这有帮助。
发布于 2016-03-04 22:27:57
也许一种选择是更改顺序注释并使用:
@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "chapter_item", joinColumns = { @JoinColumn(name = "chapter_id", nullable = false, updatable = false) }, inverseJoinColumns = {@JoinColumn(name = "item_id", nullable = false, updatable = false) })
@org.hibernate.annotations.Sort(type = SortType.COMPARATOR, comparator = ItemComparator)
public List<Item> getItems() {
return items;
}https://dzone.com/articles/sorting-collections-hibernate
检查性能解决方案,因为对于大数据量来说可能太慢了,如果您可以共享是否是一个可能的解决方案将是很好的了解
https://stackoverflow.com/questions/6136048
复制相似问题