`
uule
  • 浏览: 6310395 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Hiberante中多表关联!

阅读更多

一、多对一进行关联 (多个学生对应同一间宿舍)---学生是主体,宿舍是附体,关联关系<many-to-one>在主体学生中设置,在学生类中设置宿舍类,由于宿舍类只有一个可以直接用类来设置,在映射学生类 (User)中包含宿舍这个类(Room),在映射配置文件(User.hbm.xml)中定义

<many-to-one name="room" column="room_id" cascade="save-update"/>

哪个是主体类就在哪个配置文件定义关联关系.

cascade属性:表示关联对象的持久化,该属性也要设置在主体中,作用就是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作.
cascade的值:all:表示所有情况下都进行级联操作.
                        none:所有情况下都不进行级联操作
                        save-update:在执行save-update时进行级联操作.
                        delete:在执行delete时进行级联操作.
注意:使用cascade自动持久化时,会先检查被关联物件的id属性,未被持久化的物件之id属性是由unsaved-value决定,预设是null,如果您使用long这样的原生型态(primitive type)时,则必须自行指定预设值.

例如:<id name="id" column="ROOM_ID" unsaved-value="0">
            <generator class="increment"/>
        </id>

如果您不想额外设定unsaved-value资讯,则可以将long改为Long,这可以符合预设的unsaved-value为null的设定 .

二、一对多进行关联 (一个班级对应多个学生)

一的一端:

public class Agent {
	private Set agentmarkets = new HashSet(0);
}

<set name="agentmarkets" inverse="true" lazy="true">
     <key>
         <column name="agentid" precision="18" scale="0" not-null="true" />
     </key>
     <one-to-many class="com.techson.himsnanhwa.admin.hibernate.hbm.Agentmarket" />
</set>

 多的一端:

public class Agentmarket {

	private Agent agent;

}

 <many-to-one name="agent" class="com.techson.himsnanhwa.admin.hibernate.hbm.Agent" lazy="false">
      <column name="agentid" precision="18" scale="0" not-null="true" />
 </many-to-one>
 

 

 

在设立双向关联时,关联由多对一中「多」的哪一方维护,会比由「一」的哪一方维护来的方便,在Hibernate可以藉由inverse来设定,不设定inverse基本上也可以运行,但是效能会较差。



 classes.hbm.xml:
        <set name="students" inverse="true" >
            <key column="classesId "/>
            <one-to-many class="com.hibernate.Student"/>
        </set>

key表明在多的一端增加一个外键classesId

one-to-many表明在哪端 即多的一端即 Student端添加外键


双向关联:

student.hbm.xml:

<many-to-one name="classes" column=" classesId " class="com.Classes"/>



三、在表关联的设计中,不论是一对多还是多对一,都要将关联字段设置在多的那一方。
例如:user表格和room表格,要将关联字段room_id设置在user表格中。

 

//由一的一端来维护关系
    Set studentSet = new HashSet();
    for (int i = 0; i < 10; i++) {
	 Student student = new Student();
	 student.setName("student_" + i);    

	 session.save(student);      //此时外键为null,当save(classs)时才发出update student set class_id=".." where id=".." 更新外键
	 studentSet.add(student);
    }   
    Classes classes = new Classes();
    classes.setName("class_1");   
    //建立对象引用关系
    classes.setStudents(studentSet);   //重要
    
    session.save(classes);
 
// 由多的一端来维护关系
    Classes classes = new Classes();
    classes.setName("class_1");
    //先持久化一的一端(产生主键Id)
    session.save(classes);

    for (int i = 0; i < 10; i++) {
	 Student student = new Student();
	 student.setName("student_" + i);    
	 //建立对象引用关系
	 student.setClasses(classes);   //重要
    
	 //将student持久化
	 session.save(student);
    }

 http://www.iteye.com/problems/9945

http://hi.baidu.com/ashinehan/blog/item/15a1aa3439d9201990ef39b6.html



四、一对一关联
可以通过2中方式进行关联:

(1)外键关联:在多对一的例子中就是通过外键进行关联的.(增加一个字段)
person.hbm.xml:
<many-to-one name="idCard"   cascade="all"   
unique="true" />


其中unique表示限制一个person有一独有的 idCard,这只是单向的
双向需配置idCard的one-to-one:

 

idCard .hbm.xml:
<one-to-one name="person"  
property-ref="idCard" />


这样就完成了双向的一对一关联

property-ref: 定关联类的属性名  

                     指根据哪个属性来操作,即根据Person类中的idCard属性


(2)主键关联:两个表的主键使用相同的值,如此一个Person与IdCard就是一对

两个表使用相同的主键,Person表的主键是一个外键,参照IdCard的主键

一对一主键关联默认了级联,因此不会出现瞬时对象异常!


IdCard.hbm.xml:
<class name="IdCard">
       <id name="cardId">
            <generator class="native"></generator>
        </id>
     <one-to-one name="person"/>


Person.hbm.xml:

   <class name="Person">
         <id name="id">
            <generator class="foreign ">
                <param name="property">idCard </param>
            </generator>   //person类的对象属性idCard
        </id>
       <one-to-one name="idCard" constrained="true" />

使用constrained="true"含义:(必须加)

                                       当前主键上存在一个约束

                                      当前主键作为外键,参照了idCard



一对一关联关系的使用

http://book.51cto.com/art/200804/71563.htm

 

 

五、多对多关联:

User:int id, String name , Set roles

Role: int id, String name

 

User到Role的单向关联:

 

User.hbm.xml:

    <set name="roles" table="t_user_role ">  //第三方表 t_user_role

        <key column="userid">

        <many-to-many class="com.hibernate.Role" column="roleid">

     </set>

 

双向关联:

     table属性必须和单向关联中的table属性一致

     key中的column属性必须和单向关联中many-to-many的column属性一致

     many-to-many中的column属性必须和单向关联中key标签的column属性一致

 

Role.hbm.xml:

   <set name="users" table=" t_user_role ">

         <key column="roleid">

         <many-to-many class="com.hibernate.User" column="userid">

  </set>

 



 1

 

  • 大小: 28.6 KB
  • 大小: 17 KB
  • 大小: 17.1 KB
  • 大小: 24.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics