Teacher类:
package com.exam.pojo;import java.util.Set;public class Teacher {
private Integer tid;
private String userNum;
private String userName;
private String password;
private Set<Subject> subject;
public Integer getTid() {
return tid;
}
public void setTid(Integer tid) {
this.tid = tid;
}
public String getUserNum() {
return userNum;
}
public void setUserNum(String userNum) {
this.userNum = userNum;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<Subject> getSubject() {
return subject;
}
public void setSubject(Set<Subject> subject) {
this.subject = subject;
} }
课程类:
package com.exam.pojo;import java.util.Set;public class Subject {
private Integer sid;
private String name;
private Set<Teacher> teacher;
public Integer getSid() {
return sid;
} public void setSid(Integer sid) {
this.sid = sid;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Teacher> getTeacher() {
return teacher;
} public void setTeacher(Set<Teacher> teacher) {
this.teacher = teacher;
}}
课程hbm配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.exam.pojo.Subject" table="e_subject">
<id name="sid">
<generator class="native"></generator>
</id>
<property name="name"/>
<set name="teacher" table="teacher_subject" lazy="false" cascade="all" inverse="true">
<key column="subject_id"/>
<many-to-many class="com.exam.pojo.Teacher" column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
教师hbm配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.exam.pojo.Teacher" table="e_teacher">
<id name="tid">
<generator class="native"></generator>
</id>
<property name="userName"/>
<property name="userNum" unique="true"/>
<property name="password"/>
<set name="subject" table="teacher_subject" lazy="false" inverse="false" cascade="all">
<key column="teacher_id"/>
<many-to-many class="com.exam.pojo.Subject" column="subject_id"/>
</set>
</class>
</hibernate-mapping>
然后就是他们产生的中间表 就是没有数据 ,请大虾们研究下为什么。
package com.exam.pojo;import java.util.Set;public class Teacher {
private Integer tid;
private String userNum;
private String userName;
private String password;
private Set<Subject> subject;
public Integer getTid() {
return tid;
}
public void setTid(Integer tid) {
this.tid = tid;
}
public String getUserNum() {
return userNum;
}
public void setUserNum(String userNum) {
this.userNum = userNum;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<Subject> getSubject() {
return subject;
}
public void setSubject(Set<Subject> subject) {
this.subject = subject;
} }
课程类:
package com.exam.pojo;import java.util.Set;public class Subject {
private Integer sid;
private String name;
private Set<Teacher> teacher;
public Integer getSid() {
return sid;
} public void setSid(Integer sid) {
this.sid = sid;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Teacher> getTeacher() {
return teacher;
} public void setTeacher(Set<Teacher> teacher) {
this.teacher = teacher;
}}
课程hbm配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.exam.pojo.Subject" table="e_subject">
<id name="sid">
<generator class="native"></generator>
</id>
<property name="name"/>
<set name="teacher" table="teacher_subject" lazy="false" cascade="all" inverse="true">
<key column="subject_id"/>
<many-to-many class="com.exam.pojo.Teacher" column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
教师hbm配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.exam.pojo.Teacher" table="e_teacher">
<id name="tid">
<generator class="native"></generator>
</id>
<property name="userName"/>
<property name="userNum" unique="true"/>
<property name="password"/>
<set name="subject" table="teacher_subject" lazy="false" inverse="false" cascade="all">
<key column="teacher_id"/>
<many-to-many class="com.exam.pojo.Subject" column="subject_id"/>
</set>
</class>
</hibernate-mapping>
然后就是他们产生的中间表 就是没有数据 ,请大虾们研究下为什么。
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:145)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:394)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:367)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:620)
at com.scu.exam.daoImpl.BaseDaoImpl.add(BaseDaoImpl.java:17)
at com.scu.exam.serviceImpl.BaseServiceImpl.add(BaseServiceImpl.java:25)
at TeacherServiceTest.testAdd(TeacherServiceTest.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`exam`.`teacher_subject`, CONSTRAINT `FK2EDAC5CF490A239F` FOREIGN KEY (`subject_id`) REFERENCES `e_teacher` (`tid`))
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:648)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 27 more
org.springframework.dao.DataIntegrityViolationException: Hibernate operation: Could not execute JDBC batch update; SQL [insert into teacher_subject (teacher_id, subject_id) values (?, ?)]; Cannot add or update a child row: a foreign key constraint fails (`exam`.`teacher_subject`, CONSTRAINT `FK2EDAC5CF490A239F` FOREIGN KEY (`subject_id`) REFERENCES `e_teacher` (`tid`)); nested exception is java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`exam`.`teacher_subject`, CONSTRAINT `FK2EDAC5CF490A239F` FOREIGN KEY (`subject_id`) REFERENCES `e_teacher` (`tid`))
Caused by: java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`exam`.`teacher_subject`, CONSTRAINT `FK2EDAC5CF490A239F` FOREIGN KEY (`subject_id`) REFERENCES `e_teacher` (`tid`))
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:648)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:145)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:394)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:367)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:620)
at com.scu.exam.daoImpl.BaseDaoImpl.add(BaseDaoImpl.java:17)
at com.scu.exam.serviceImpl.BaseServiceImpl.add(BaseServiceImpl.java:25)
at TeacherServiceTest.testAdd(TeacherServiceTest.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
还有数据库中,中间表的外键引用对不??
Cannot add or update a child row: a foreign key constraint fails (`exam`.`teacher_subject`, CONSTRAINT `FK2EDAC5CF490A239F` FOREIGN KEY (`subject_id`) REFERENCES `e_teacher` (`tid`))
检查下!!!!!!!!或者是在你插入的时候,比如要插teacher表数据,因为要级联,多要要先给中间表的subject_id给值
A,B表多对多的关系需要引入C表,C表中的所有属性即为主键又为外面分别参照A,B 两表
C表中不能有其他属性
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.exam.pojo.Subject" table="e_subject">
<id name="sid">
<generator class="native"> </generator>
</id>
<property name="name"/>
<set name="teacher" table="teacher_subject" lazy="false" cascade="all" inverse="true">
<key column="subject_id"/>
<many-to-many class="com.exam.pojo.Teacher" column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
把里面的inverse=“true”改为false就可以从subject方向插入了!
注意不要在两张表中同时设置inverse=true,否则死人了我不管....
teacher.getSubjects().add(subject);
session.save(teacher); //保存的是老师,而不是课程,
保存,它会级联保存中间表,和课程表.控制端的作用也在此.
从你的错误看来,是违反了外键约束,就保存这个表数据时,他引用了其它的表,但其它表还没数据.删除时,你可以随便删除subject,中间表还是有数据的,但如果你删除teacher时,它会级联删除中间表的数据.因为它是控制端,