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 inverse="true" lazy="true"> <key> <column name="agentid" precision="18" scale="0" not-null="true" /> </key> <one-to-many /></set>
?多的一端:
??
?
在设立双向关联时,关联由多对一中「多」的哪一方维护,会比由「一」的哪一方维护来的方便,在Hibernate可以藉由inverse来设定,不设定inverse基本上也可以运行,但是效能会较差。
?classes.hbm.xml:
???????<set name="students" inverse="true">
??????????? <key column="classesId"/>
??????????? <one-to-many column="classesId" src="/img/2012/07/17/1440304267.jpg">
三、在表关联的设计中,不论是一对多还是多对一,都要将关联字段设置在多的那一方。
例如:user表格和room表格,要将关联字段room_id设置在user表格中。?
??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 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 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 column="userid">
? </set>
?
?1?