【发布时间】:2009-07-09 18:33:17
【问题描述】:
我有一个与字符串类型具有一对多关系的用户对象。我相信它们是简单的映射。 types 表包含关联的 user_id 和变量类型名称,主键“id”基本上是一个计数器。
<class name="Users" table="users">
<id column="id" name="id" />
...
<set name="types" table="types" cascade="save-update">
<key column="id" />
<one-to-many class="Types" />
</set>
</class>
<class name="Types" table="types">
<id column="id" name="id" />
<property column="user_id" name="user_id" type="integer" />
<property column="type" name="type" type="string" />
</class>
这是我用来添加到数据库的java:
User u = new User();
u.setId(user_id);
...
Collection<Types> t = new HashSet<Types>();
t.add(new Type(auto_incremented_id, user_id, type_name));
u.setTypes(t);
getHibernateTemplate().saveOrUpdate(u);
当我运行它时,它给出了这个错误:
61468 [http-8080-3] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1062, SQLState: 23000
61468 [http-8080-3] ERROR org.hibernate.util.JDBCExceptionReporter - Duplicate entry '6' for key 'PRIMARY'
61468 [http-8080-3] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
当我检查sql时,它显示:
Hibernate: insert into users (name, id) values (?, ?)
Hibernate: insert into types (user_id, type, id) values (?, ?, ?)
Hibernate: update types set id=? where id=?
- 为什么 Hibernate 会尝试更新类型的 id?
错误提示:键 'PRIMARY' 的条目 '6' 重复,但真的没有吗?我确保每次都增加 id。并且用户和类型被正确添加到数据库中。
我记录了输入的信息,添加的类型的 id 为 7,用户 id 为 6。难道 Hibernate 采用了 6 的 user_id 并尝试更新类型并设置 id=6 where id=7 ?所以主键重复错误?
但它为什么会做出如此奇怪的事情呢?有没有办法阻止它更新?
- 我应该手动设置 id 吗?如果没有,那么我应该如何添加类型?当我添加一个只有类型字符串且没有 id 的类型对象时,它会出现其他错误。
谢谢各位。这几天一直在琢磨……
【问题讨论】:
标签: java mysql hibernate mysql-error-1062