文字列型と1対多の関係にあるユーザーオブジェクトがあります。単純なマッピングだと思います。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がuser_idを6にして、タイプを更新し、id=6を設定しようとした可能性があります。したがって、重複する主キーエラー?
しかし、なぜそれはそんなに奇妙なことをするのでしょうか?更新を停止する方法はありますか?
- IDを手動で設定する必要がありますか?そうでない場合、どのようにタイプを追加する必要がありますか?タイプ文字列のみを含み、IDを含まないタイプオブジェクトを追加すると、他のエラーが発生します。
みんなありがとう。何日もそれを熟考してきました...