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>
然后就是他们产生的中间表 就是没有数据 ,请大虾们研究下为什么。

解决方案 »

  1.   

    我是楼主:顺便补充点问题 我改了多次。 多对多映射的问题不是中间没数据,就是出错,我用的是SSH框架。顺便把出错的信息发出来:
    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)
     
      

  2.   

    这样直接的多对多映射,应该有3张表(teacher,teacher_subject,subject)2个xml文件。就是你上边的那2个。你的配置文件好像没问题,不知道是你的中间表id名称对不对。
    还有数据库中,中间表的外键引用对不??
    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给值
      

  3.   

    应该要有第3张表
    A,B表多对多的关系需要引入C表,C表中的所有属性即为主键又为外面分别参照A,B 两表
    C表中不能有其他属性
      

  4.   

    第三张表 是他自动生成的 ,后来发现可以从teacher方SAVE 不能从subject方插入。 不晓得为什么
      

  5.   

    课程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> 
    把里面的inverse=“true”改为false就可以从subject方向插入了!
      

  6.   

    因为我怕测试不充分 ,如:既要测试已经插入的teacher数据,还要测试新生成的teacher数据。我最近都没空测试了 不知道 你们以前注意过没。
      

  7.   

    你的教师和课程是多对多的关系,因此还会生成第三张关系表,而且第三张关系表里面的数据一般是由教师表和课程表共同来维护的(就是说对教师和课程表的内容进行增删操作都会影响关系表中的内容)。但是如果你想把关系表中的数据交给莫一张表来维护,比如你想交给教师表来维护,这时你就需要在课程表的many-to-many元素中增添inverse=true,表明关系表的数据由教师表来维护,课程表内容的变化不影响关系表的内容。
    注意不要在两张表中同时设置inverse=true,否则死人了我不管....
      

  8.   

    保存东西的时候顺序弄反了?你的控制端在哪,是老师.你可以用
    teacher.getSubjects().add(subject);
    session.save(teacher);  //保存的是老师,而不是课程,
    保存,它会级联保存中间表,和课程表.控制端的作用也在此.
    从你的错误看来,是违反了外键约束,就保存这个表数据时,他引用了其它的表,但其它表还没数据.删除时,你可以随便删除subject,中间表还是有数据的,但如果你删除teacher时,它会级联删除中间表的数据.因为它是控制端,