【发布时间】:2011-09-02 10:10:53
【问题描述】:
我使用列表。该列表由一个复合主键组成,该主键也用于对列表进行排序。
问题是如果我删除列表中的一个元素(关键化合物),
注解@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) 您是否在 Item 类中创建了 equals & hashCode? 2)它是2路关联吗? (从你的班级到项目)和 3)请包括你用来删除项目的代码。
-
你能提供给我们你的章节和项目的实现吗?
-
你不能使用 cascade=CascadeType.ALL
-
错误表明您的 UPDATE 查询导致数据库中不允许出现重复的主键。如果更新将现有主键设置为另一条记录,或者如果更新条件适用于超过 1 条记录。
-
我认为这已经在这里得到了回答:stackoverflow.com/questions/4022509/… 这不是完全相同的映射,但 Hibernate 的问题似乎是一样的。