Java 无法执行JDBC批处理更新:线程中出现异常;“主要”;org.hibernate.exception.ConstraintViolationException:

Java 无法执行JDBC批处理更新:线程中出现异常;“主要”;org.hibernate.exception.ConstraintViolationException:,java,mysql,hibernate,Java,Mysql,Hibernate,我是新的hibernate编程请帮助我,我有问题,而执行以下文件。我使用的是MySQL数据库。我的错误是 SLF4J:未能加载类“org.SLF4J.impl.StaticLoggerBinder”。 SLF4J:默认为无操作(NOP)记录器实现 SLF4J:有关更多详细信息,请参阅。 Hibernate:插入UserDetails(用户名)值(?) Hibernate:插入UserDetails(用户名)值(?) Hibernate:插入UserDetails(用户名)值(?) 休眠:插入车辆

我是新的hibernate编程请帮助我,我有问题,而执行以下文件。我使用的是MySQL数据库。我的错误是

SLF4J:未能加载类“org.SLF4J.impl.StaticLoggerBinder”。 SLF4J:默认为无操作(NOP)记录器实现 SLF4J:有关更多详细信息,请参阅。 Hibernate:插入UserDetails(用户名)值(?) Hibernate:插入UserDetails(用户名)值(?) Hibernate:插入UserDetails(用户名)值(?) 休眠:插入车辆(vehiName)值(?) 休眠:插入车辆(vehiName)值(?) 休眠:在UserDetails\u vehicle(UserDetails\u userID,vehi\u vehiID)中插入值(?,) 休眠:在UserDetails\u vehicle(UserDetails\u userID,vehi\u vehiID)中插入值(?,) 休眠:在UserDetails\u vehicle(UserDetails\u userID,vehi\u vehiID)中插入值(?,)

线程“main”org.hibernate.Exception.ConstraintViolationException中出现异常:无法执行JDBC批处理更新 位于org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:96) 位于org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66) 位于org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 位于org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) 位于org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188) 位于org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 位于org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 位于org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 位于org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) 位于org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) 位于com.annt.java.UserTest.main(UserTest.java:34) 原因:java.sql.BatchUpdateException:键“vehi\u vehiID”的重复条目“1” 位于com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669) 位于com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085) 位于org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 位于org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ... 8个以上

UserDetails.java usertest.java
错误消息非常清楚:存在唯一的密钥冲突约束:您正在为两个不同的用户插入相同的车辆:

user1.getVehi().add(veh1);
//...
user3.getVehi().add(veh1);

这是不正确的,因为用户和车辆之间的关联是一个OneToMany关联。因此,给定的车辆只属于一个用户。如果你想在用户之间共享一辆车,那么你需要一个多用户关联,并且你需要删除
UserDetails\u vehi\u vehiID
on上的唯一约束(如果你使用它来生成模式,Hibernate将不会创建它)

你正在影响veh1到2个不同的用户,因此你需要一个多用户关联,一个也没有:

@OneToMany
private List vehi=new ArrayList()

Many2Many:一个用户可以影响多个车辆,一个车辆可以影响多个用户 One2Many:一个用户可以影响多个车辆,但一个车辆只能由一个用户拥有


这就是为什么出现完整性异常的原因

执行关系时,对象值必须不同 在user3.getVehi().add(veh1)中指定不同的值。

键“vehi\u vehiID”的重复条目“1”-插入相同的主键值两次。
 @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;

    }
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();
    }

}
user1.getVehi().add(veh1);
//...
user3.getVehi().add(veh1);