Apr*_*ril 5 java mysql hibernate mysql-error-1062
我有一个与String类型具有一对多关系的用户对象.我相信它们是简单的映射.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>
Run Code Online (Sandbox Code Playgroud)
这是我用来添加到数据库的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);
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它会出现此错误:
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
Run Code Online (Sandbox Code Playgroud)
当我检查sql时,它显示:
Hibernate: insert into users (name, id) values (?, ?)
Hibernate: insert into types (user_id, type, id) values (?, ?, ?)
Hibernate: update types set id=? where id=?
Run Code Online (Sandbox Code Playgroud)
错误说:关键'PRIMARY'重复输入'6',但确实没有?我确保每次都会增加ID.并且用户和类型正确地添加到数据库中.
我记录了进入的信息,添加的类型的id为7,用户ID为6.难道Hibernate的user_id为6并尝试更新类型并设置id = 6,其中id = 7?因此重复的主键错误?
但是为什么它会这么奇怪呢?有没有办法阻止它更新?
多谢你们.几天来一直在考虑它......
您最大的问题是<key>映射中的列不正确 - 它应该是“user_id”,而不是“id”。也就是说,你的整个映射对我来说似乎有点奇怪。
首先,如果你想要自动生成 ID,你应该让 Hibernate 通过指定适当的生成器来处理这个问题:
<id列=“id”名称=“id”> <生成器类=“本机”/> </id>
阅读有关生成器的Hibernate 文档以了解各种可用选项。
其次,如果您需要的只是一组字符串类型,请考虑将它们重新映射到元素集合而不是一对多关系:
<设置名称=“类型”表=“类型”>
<键列=“user_id”/>
<元素列=“类型”类型=“字符串”/>
</集>
这样您就不需要显式的“类型”类或映射。即使您确实希望在“类型”上具有其他属性,您仍然可以将其映射为组件而不是实体。
最后,如果由于某些您未描述的要求而“类型”必须是实体,则“用户”和“类型”之间的关系是双向的,需要这样映射:
<set name="types" table="types" inverse="true">
<键列=“user_id”/>
<one-to-many class="类型"/>
</集>
...
在类型映射中:
<多对一名称=“用户”列=“user_id”not-null=“true”/>
在后一种情况下,“类型”必须具有“用户”类型的“用户”属性。 这是一个详细的例子。
| 归档时间: |
|
| 查看次数: |
8365 次 |
| 最近记录: |