[解決済み] org.hibernate.exception.ConstraintViolationException: JDBC バッチ更新を実行できませんでした。
質問
データが正常に挿入されたにもかかわらず、以下のようなスタックトレースが表示されます。
Hibernate: select attendee_.attendeeId, attendee_.attendeeName as attendee2_1_ from attendee attendee_ where attendee_.attendeeId=?
Hibernate: select attendee_.attendeeId, attendee_.attendeeName as attendee2_1_ from attendee attendee_ where attendee_.attendeeId=?
Hibernate: insert into event (eventName, startDate, eventId) values (?, ?, ?)
Hibernate: insert into attendee (attendeeName, attendeeId) values (?, ?)
Hibernate: insert into attendee (attendeeName, attendeeId) values (?, ?)
Hibernate: update attendee set attendeeId=? where attendeeId=?
Hibernate: update attendee set attendeeId=? where attendeeId=?
Aug 29, 2010 7:39:10 PM org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 1062, SQLState: 23000
Aug 29, 2010 7:39:10 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Duplicate entry '11' for key 'PRIMARY'
Aug 29, 2010 7:39:10 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
at com.practice.hibernate.basic.BasicOperations.main(BasicOperations.java:51)
Caused by: java.sql.BatchUpdateException: Duplicate entry '11' for key 'PRIMARY'
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
... 6 more
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
at com.practice.hibernate.basic.BasicOperations.main(BasicOperations.java:51)
Caused by: java.sql.BatchUpdateException: Duplicate entry '11' for key 'PRIMARY'
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
... 6 more
ご注意ください。
a) 現在、私のデータベースにはレコードがありません。 b) データが正常にDBに挿入される。
ここでは、2 つの Attendee オブジェクトを含む Event オブジェクトを永続化しようとしています。それだけです。
私のテストクラス。
public static void main(String[] args) {
Session session = HibernateRuntime.getSession();
try {
Set<Attendee> attendees = new HashSet<Attendee>(2);
Attendee attendee = new Attendee();
attendee.setAttendeeId(3);
attendee.setAttendeeName("Baswanth Rao");
Attendee attendee1 = new Attendee();
attendee1.setAttendeeId(4);
attendee1.setAttendeeName("Razi Ahmed");
attendees.add(attendee);
attendees.add(attendee1);
Event event = new Event();
event.setEventId(11);
event.setEventName("Initiatives Workshop 3");
event.setStartDate(new Date());
event.setAttendees(attendees);
session.save(event);
session.flush();
} finally {
session.close();
}
}
イベント.hbm.xml。
<hibernate-mapping package="com.practice.hibernate.vo">
<class name="Event" table="event">
<id name="eventId" column="eventId" type="long">
<generator class="assigned" />
</id>
<property name="eventName" type="string" length="100" />
<property name="startDate" type="date" />
<set name="attendees" cascade="all">
<key column="attendeeId" />
<one-to-many class="Attendee" />
</set>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.autocommit">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping resource="com/practice/hibernate/vo/Event.hbm.xml"></mapping>
<mapping resource="com/practice/hibernate/vo/Attendee.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
解決方法は?
Event.hbm.xmlに記載されています。
<set name="attendees" cascade="all">
<key column="attendeeId" />
<one-to-many class="Attendee" />
</set>
わかりやすく言うと、これは、カラムが
Attendee.attendeeId
は
外部キー
アソシエーションの
attendees
の主キーを指しており
Event
.
これらの Attendees をイベントに追加すると、hibernate は外部キーを更新して、変更された関連付けを表現します。その同じ列は Attendee の主キーでもあるため、これは主キー制約に違反します。
Attendee のアイデンティティとイベントへの参加は独立しているので、主キーと外部キーには別々のカラムを使用する必要があります。
編集:selectsは、バージョンプロパティが設定されていないようなので、出席者がすでにデータベースに存在するかどうかをhibernateが知ることができないため(以前のセッションでロードされた可能性がある)、hibernateがselectsを発行してチェックするためかもしれません。updateステートメントに関しては、おそらくその方が実装しやすかったのでしょう。もし、このような個別の更新をなくしたいのであれば、両端から関連付けをマッピングすることをお勧めし、その際に
Event
-として終了します。
inverse
.
関連
-
[解決済み】ResultSetの例外 - 結果セットの開始前
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み】Java LinkedListでNodesを使用する
-
[解決済み】Javaの".class expected "について
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み] JDBC バッチアップデートを実行できませんでした:スレッド "main" で例外 org.hibernate.exception.ConstraintViolationException:
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】このコンパイルユニットは名前付きモジュールに関連しているため、名前付きパッケージeclipseを宣言する必要があります。
-
[解決済み】Javaの".class期待値"
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み】Javaメソッドスタブ
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。