[解決済み] JDBC バッチアップデートを実行できませんでした:スレッド "main" で例外 org.hibernate.exception.ConstraintViolationException:
質問
私はHibernateプログラミングの初心者です、助けてください。私のエラーは次のとおりです。
<ブロッククオートSLF4J: クラス "org.slf4j.impl.StaticLoggerBinder" の読み込みに失敗しました。 SLF4J: 無操作(NOP)ロガーの実装がデフォルトになりました。 SLF4J: 参照 http://www.slf4j.org/codes.html#StaticLoggerBinder をご覧ください。 Hibernate: insert into UserDetails (userName) values (?) Hibernate: insert into UserDetails (userName) values (?) Hibernate: insert into UserDetails (userName) values (?) Hibernate: vehicle (vehiName)に値を挿入 (?) Hibernate: vehicle (vehiName)に値を挿入 (?) Hibernate: UserDetails_vehicle (UserDetails_userID, vehi_vehiID) values (?, ?) に挿入。 Hibernate: insert into UserDetails_vehicle (UserDetails_userID, vehi_vehiID) values (?, ?) Hibernate: insert into UserDetails_vehicle (UserDetails_userID, vehi_vehiID) values (?, ?)(UserDetails_vehicleに挿入する。
スレッド "main" org.hibernate.exception.ConstraintViolationException で例外が発生しました。JDBC バッチ更新を実行できませんでした。 at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) at com.annt.java.UserTest.main(UserTest.java:34) 原因:java.sql.BatchUpdateException: キー 'vehi_vehiID' のエントリ '1' が重複しています。 at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ... 8 more
UserDetails.java
@Entity
public class UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int userID;
@OneToMany
private List<vehicle> vehi = new ArrayList<vehicle>();
public List<vehicle> getVehi() {
return vehi;
}
public void setVehi(List<vehicle> vehi) {
this.vehi = vehi;
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
vehicle.java
@Entity
public class vehicle {
@Id
@GeneratedValue
private int vehiID;
public int getVehiID() {
return vehiID;
}
public void setVehiID(int vehiID) {
this.vehiID = vehiID;
}
public String getVehiName() {
return vehiName;
}
public void setVehiName(String vehiName) {
this.vehiName = vehiName;
}
private String vehiName;
}
usertest.java
public class UserTest {
public static void main(String[] args) {
vehicle veh1 = new vehicle();
veh1.setVehiName("car");
vehicle veh2 = new vehicle();
veh2.setVehiName("bus");
UserDetails user1 = new UserDetails();
UserDetails user2 = new UserDetails();
user1.setUserName("user2");
user2.setUserName("user2");
UserDetails user3 = new UserDetails();
user3.setUserName("user3");
user1.getVehi().add(veh1);
user2.getVehi().add(veh2);
user3.getVehi().add(veh1);
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session ss = sf.openSession();
ss.beginTransaction();
ss.save(user1);
ss.save(user2);
ss.save(user3);
ss.save(veh1);
ss.save(veh2);
ss.getTransaction().commit();
ss.close();
}
}
解決方法は?
エラーメッセージは非常に明確です:ユニークキー違反の制約があります:2つの異なるユーザーに対して同じ車両を挿入しているのです。
user1.getVehi().add(veh1);
//...
user3.getVehi().add(veh1);
ユーザーと車両の関連付けはOneToManyの関連付けであるため、これは正しくありません。したがって、ある車両は1人のユーザーにしか属しません。もしユーザー間で車両を共有したい場合は、ManyToManyアソシエーションが必要であり、その場合は
UserDetails_vehicle.vehi_vehiID
を使用してスキーマを生成すると、Hibernateはこれを作成しません)。
関連
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】javaで無効な文字定数
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み】Java JDK - doubleからintへの非可逆変換の可能性
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】Java LinkedListでNodesを使用する
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み] JavaでSSLピアが正しくシャットダウンされない
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。