@OrderColumn生成更新主键的请求

2022-09-02 04:53:17

我使用列表。该列表由复合主键组成,该主键也用于对列表进行排序。问题是,如果我删除列表中的某个元素(键复合),注释会生成更新主键的请求,并且成本会上升一个类型异常:@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;
}

以下是我遇到问题的更新查询:

Hibernate: 
update
    chapter_item 
set
    item_id=? 
where
    chapter_id=? 
    and iorder=?  

我想知道这是否是一个已知的错误,是否有人有解决方案?


答案 1

关于@OrderColumn,以下文档位于 http://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html

指定用于维护列表的持久顺序的列。持久性提供程序负责在检索时和数据库中维护顺序。持久性提供程序负责在刷新到数据库时更新顺序,以反映影响列表的任何插入、删除或重新排序。

因此,我们看到持久性提供程序(即休眠)负责更新名为 的列。还有人说:iorder

OrderColumn 批注是在 OneToMany 或 ManyToMany 关系或元素集合上指定的。OrderColumn 批注在引用要排序的集合的关系的一侧指定。顺序列作为实体或可嵌入类的状态的一部分不可见。

请注意这句话:

顺序列作为实体或可嵌入类的状态的一部分不可见。

因此,我是否可以建议您考虑不选择列,因为它是您的一部分,并且当您删除或在列表中插入元素时,休眠肯定会更新此值()。iorder@OrderColumncomposite keyList<Item>

希望,这有帮助。


答案 2

也许一个选项是更改顺序注释并使用:

@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

检查性能解决方案,因为对于大量数据来说可能太慢了,如果您可以共享是否是可能的解决方案,那就太好了


推荐