有两张表, 一张班级表(T_class),一张学生表(T_student).学生类:省略get/set方法
 
  public class Student {
private Integer studentId;
private String studentName;
private Classes classes;
}班级类:省略get/set方法
 
  public class Classes{
private Integer classId;
private String className;
private Set<Student> students = new HashSet<Student>();
}
Student.hbm.xml<hibernate-mapping package="wxm.beans">
<class name="Student" table="student">
<id name="studentId" type="integer" column="student_id">
<generator class="identity" />
</id>
<property name="studentName" length="20" not-null="true"
column="student_name" />
<property name="perform" /> <many-to-one name="classes" column="class_id"
 outer-join="true" class="wxm.beans.Classes" /> </class>
</hibernate-mapping>
Classes.hbm.xml<hibernate-mapping package="wxm.beans">
<class name="Classes" table="t_class">
<id name="classId" type="integer" column="class_id">
<generator class="identity" />
</id>
<property name="className" length="20" not-null="true"
column="class_name" /> <set name="students" outer-join="true" inverse="true">
<key column="class_id" />
<one-to-many class="wxm.beans.Student" />
</set> </class>
</hibernate-mapping>
学生和班级是多对一关系,班级和学生是一对多关系,是否两个XML都要写上他们的关系呢? 
另外一个问题是关于cascade的
@Test
public void save() {
Classes claz = new Classes("英语班");
classService.addClass(claz); Student student = new Student("王小二");
student.setClasses(classService.getClass(1));
student.setPerform(55.5f);
studentService.addStudent(student);

}cascade=ALL的时候上面这段代码是不成功的。还麻烦大神解释下。
另外删除cascade成功保存之后,要删除班级而不得。@Test
public void delClass() {
classService.getClass(1).getStudents().remove(
studentService.getStudent(1));
classService.delClass(1);
}想删除班级不是把班级内的学生清空,再删除就OK了吗,可是并不行。 

解决方案 »

  1.   

    恩 两个都要写上
    1、你在班级配置里面设置了inverse,由学生而不是由班级维护关系的,而你是先保存班级再保存学生…………
    2、你上面那段配置代码并没有配置cascade属性啊,此外你取消了级联,你学生表里面有班级的关联,班级肯定删不掉
      

  2.   


    2楼的,请问下不先保存班级,这句话就不起作用了。student.setClasses(classService.getClass(1));
    设置了cascade属性后会报detached entity passed to persist这个错误。
    少包了?还是哪里错了。
      

  3.   

    我觉得你把学生set到班级里去了  但是还少了班级也要设置包含学生的 
    claz.getStudent().add(student);这个写在后面 (class里面get学生的方法)
    我也是初学这个
      

  4.   

    <hibernate-mapping>
        <class name="com.entity.Class" table="class" schema="dbo" catalog="hib4">
            <id name="bid" type="java.lang.Integer">
                <column name="stuid" />
                <generator class="native" />
            </id>
            <property name="bname" type="java.lang.String">
                <column name="stuname" length="50" />
            </property>
            
            <many-to-one name="student" class="com.entity.Student" column="studentrId" ></many-to-one>
           
        </class>
    </hibernate-mapping><hibernate-mapping>
        <class name="com.entity.student" table="student" schema="dbo" catalog="hib4">
            <id name="stuid" type="java.lang.Integer">
                <column name="stuid" />
                <generator class="native" />
            </id>
            <property name="stuname" type="java.lang.String">
                <column name="stuname" length="50" />
            </property>
                    <set name="class" cascade="all" inverse="true" >
               <key column="authorId"></key>           
    <one-to-many class="com.entity.Class"/>
            </set>
        </class>
    </hibernate-mapping>
    试试这个
      

  5.   

    <hibernate-mapping>
      <class name="com.entity.Class">
      <id name="bid" type="java.lang.Integer">
      <column name="stuid" />
      <generator class="native" />
      </id>
      <property name="bname" type="java.lang.String">
      <column name="stuname" length="50" />
      </property>
        
      <many-to-one name="student" class="com.entity.Student" column="studentrId" ></many-to-one>
        
      </class>
    </hibernate-mapping><hibernate-mapping>
      <class name="com.entity.student">
      <id name="stuid" type="java.lang.Integer">
      <column name="stuid" />
      <generator class="native" />
      </id>
      <property name="stuname" type="java.lang.String">
      <column name="stuname" length="50" />
      </property>
      <set name="class" cascade="all" inverse="true" >
      <key column="studentid"></key>   
    <one-to-many class="com.entity.Class"/>
      </set>
      </class>
    </hibernate-mapping>有些细节你自己改下看看。我是通过自己以前些的 作者和书的列子改的。
      

  6.   


    表和关系是建立好了
    数据库数据也是对    Classes claz = new Classes("英语班");
        Student student = new Student("王小二");
        student.setClasses(claz);
        student.setPerform(55.5f);
        claz.getStudents().add(student);
        studentService.addStudent(student);
        classService.addClass(claz);但是还是抛出detached entity passed to persist: wxm.beans.Classes这样的错误。
    是不是要分开来保存才能成功,这样是没有办法成功的?
      

  7.   

    为什么要用xml,用Annotation啊,比xml简单多了...
    新项目建议用annotatiaon,xml只要能看懂就行了你的问题:
    是不是两个xml都要写,就看你需求了,这就是hibernate的单向和双向。
    设置了级联之后要考虑到数据库的实现方式,在保存之前必须要设置好(setter)两者的关联,不然就容易空指针。