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条,数据库中数据添加成功。