首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@OrderColumn生成更新主键的请求

@OrderColumn生成更新主键的请求
EN

Stack Overflow用户
提问于 2011-05-26 17:00:02
回答 2查看 3.1K关注 0票数 21

我使用列表。该列表由一个复合主键组成,该复合主键也用于对列表进行排序。问题是,如果我删除列表中的一个元素(键复合),注释@OrderColumn会生成一个更新主键的请求,并且开销会增加一个类型的异常:

代码语言:javascript
复制
[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  

下面是映射的定义:

代码语言:javascript
复制
@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查询:

代码语言:javascript
复制
Hibernate: 
update
    chapter_item 
set
    item_id=? 
where
    chapter_id=? 
    and iorder=?  

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

EN

回答 2

Stack Overflow用户

发布于 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肯定会更新此值。

霍普,这有帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-03-04 22:27:57

也许一种选择是更改顺序注释并使用:

代码语言:javascript
复制
@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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6136048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档