Hibernate数据关联映射出现Could not execute JDBC batch update的异常处理

Hibernate数据关联映射出现Could not execute JDBC batch update的异常处理

该异常是在创建多对多映射时出现的,当时考虑创建老师表和学生表,老师和学生的关系符合多对多映射,一个老师可以有多个学生,一个学生也可以有多个老师,多对多映射需要使用中间表来建立两个表之间的关系。

首先配置Teacher.hbm.xml

<class name="Teacher" table="HUQB_TEACHER">
        <id name="id">
            <!-- Mysql 配置主键生成策略 -->
            <generator class="native"/>
        </id>   
        <property name="tname"/>
        <!-- 配置多对多 -->
        <set name="students" table="STUDENT_TEACHER">
            <key column="tid"/>
            <many-to-many class="Student" column="sid" />
        </set>
    </class>

Student.hbm.xml配置如下

<class name="Student" table="STUDENT">
        <id name="id">
            <generator class="native"/>
        </id>   
        <property name="sname"/>
        <!-- 配置多对多 -->
        <set name="teachers" table="STUDENT_TEACHER">
            <key column="sid"/>
            <many-to-many class="Teacher" column="tid" />
        </set>
    </class>

编写测试类

Teacher teacher1=new Teacher();
teacher1.setTname("张三1");
Set<Teacher> teachers=new HashSet<Teacher>();
teachers.add(teacher1);

Student student1=new Student();
student1.setSname("李四1");
Set<Student> students=new HashSet<Student>();
students.add(student1);

teacher1.setStudents(students);
student1.setTeachers(teachers);

session.save(teacher1);
session.save(student1);
//提交事务
tx.commit();

编写测试类运行后,myeclipse提示如下

Hibernate: insert into HUQB_TEACHER (tname) values (?)
Hibernate: insert into HUQB_STUDENT (sname) values (?)
Hibernate: insert into HUQB_STUDENT_TEACHER (tid, sid) values (?, ?)
Hibernate: insert into HUQB_STUDENT_TEACHER (sid, tid) values (?, ?)

Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

Caused by: java.sql.BatchUpdateException: Duplicate entry '4-4' for key 'PRIMARY'

错误原因是,主键重复,4主键已经存在,不能再进行添加了。
后来反复测试,发现是没有给set标签内的属性设置inverse,inverse的意思是“你要放弃关系维护吗?”该值默认为false,如果在多对多的关系映射中不指定关系维护方,会导致双方都进行关系维护,当主键4已经存在的时候是无法再添加的,给一方set设置inverse=”true”后程序正常运行

Hibernate: insert into TEACHER (tname) values (?)
Hibernate: insert into STUDENT (sname) values (?)
Hibernate: insert into STUDENT_TEACHER (tid, sid) values (?, ?)

此次运行后SQL语句为3条,数据库中数据添加成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值