私は、String型と1対多の関係を持つユーザーオブジェクトを持っています。私は彼らが単純なマッピングだと信じています。型テーブルは、基本的にカウンタである主キー 'id'を使用して、関連するuser_idおよび変数型名を保持します。Hibernate異常な動作を保存します。
<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を更新しようとしますか?
- idを手動で設定する必要がありますか?そうでない場合は、どのようにタイプを追加しますか?その中に型文字列しかなく、idsも持たない型オブジェクトを追加すると、他のエラーが発生します。
エラー:「PRIMARY」キーのエントリが重複していますが、実際にはありませんか? IDを毎回インクリメントするようにしました。ユーザーとタイプはデータベースに正しく追加されます。
追加された型のIDは7で、ユーザーIDは6です。Hibernateはuser_idが6で、型の更新を試み、id = 6を設定しようとしました。id = 7?したがって、重複した主キーのエラー?
しかし、なぜそれは奇妙なことをしますか?それを更新するのを止める方法はありますか?
みんなありがとう。数日間それを調べています...
のおかげで多くのことを双方向ソリューションをしようとします!ありがとう! – April