1. ホーム
  2. java

[解決済み] JDBC バッチアップデートを実行できませんでした:スレッド "main" で例外 org.hibernate.exception.ConstraintViolationException:

2022-02-18 17:49:08

質問

私は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はこれを作成しません)。