首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

Hibernate的多对一,一对多关系的初级有关问题

2012-02-03 
Hibernate的多对一,一对多关系的初级问题。有两张表, 一张班级表(T_class),一张学生表(T_student).学生类:

Hibernate的多对一,一对多关系的初级问题。
有两张表, 一张班级表(T_class),一张学生表(T_student).

学生类:省略get/set方法
 

Java code
  public class Student {    private Integer studentId;    private String studentName;    private Classes classes;}

班级类:省略get/set方法
 
Java code
  public class Classes{    private Integer classId;    private String className;    private Set<Student> students = new HashSet<Student>();}


Student.hbm.xml
XML code
<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
XML code
<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的

Java code
@Testpublic 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成功保存之后,要删除班级而不得。
Java code
@Test    public void delClass() {        classService.getClass(1).getStudents().remove(                studentService.getStudent(1));        classService.delClass(1);    }

想删除班级不是把班级内的学生清空,再删除就OK了吗,可是并不行。

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


我觉得你把学生set到班级里去了 但是还少了班级也要设置包含学生的 
claz.getStudent().add(student);这个写在后面 (class里面get学生的方法)
我也是初学这个
[解决办法]
<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>


试试这个
[解决办法]
<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>



有些细节你自己改下看看。我是通过自己以前些的 作者和书的列子改的。
[解决办法]
为什么要用xml,用Annotation啊,比xml简单多了...
新项目建议用annotatiaon,xml只要能看懂就行了

你的问题:
是不是两个xml都要写,就看你需求了,这就是hibernate的单向和双向。
设置了级联之后要考虑到数据库的实现方式,在保存之前必须要设置好(setter)两者的关联,不然就容易空指针。

热点排行