Hibernate的实体映射
Hibernate关联关系映射目录
│
├─单向关联
│ ├─ 一对一外键单向关联
│ ├─ 一对一主键单向关联
│ ├─ 一对一连接表单向关联
│ ├─ 一对多外键单向关联
│ ├─ 一对多连接表单向关联
│ ├─ 多对一外键单向关联
│ ├─ 多对一连接表单向关联
│ └─ 多对多单向关联
└─双向关联
├─ 一对一外键双向关联
├─ 一对一主键双向关联
├─ 一对一连接表双向关联
├─ 一对多外键双向关联
├─ 一对多连接表双向关联
└─ 多对多双向关联
一:Hibernate有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式。
共享主键方式:
所谓共享主键方式就是限制两个数据表的主键使用相同的值,通过主键形成一对一映射关系。
唯一外键方式:
所谓唯一外键方式就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系,这种一对一的关系其实就是多对一关联关系的一种特殊情况.
二:映射多对一单向实体关联关系:外键参照方式.
以下是摘自:http://blog.sina.com.cn/s/blog_82faefb00100rwgp.html
1 Hibernate的关联关系映射 2 1.单向关联: 3 a.多对一: 4 在子表中加入: 5 <many-to-one name="address" column="addressId" class="指向的主键类" not-null="true"/> 6 7 b.一对一:其实就是many-to-one的一种情况.唯一不同的就是关联中的外键字段具有唯一性约束. 8 在子表中加入:(unique="true") 9 <many-to-one name="address" column="addressId" unique="true" not-null="true"/> 10 或者 11 在主表加入: 12 <one-to-one name="person" constrained="true"/> 13 14 c.一对多: 15 在主表中加入: 16 <set name="addresses"> 17 <key column="personId" not-null="true"/> 18 <one-to-many class="Address"/> 19 </set> 20 21 2.使用连接表的单向关联 22 a.一对多:通过制定unique="true",我们可以把多样性从多对多改变为一对多。 23 在主表中添加: 24 <set name="addresses" table="PersonAddress"> 25 <key column="personId"/> 26 <many-to-many column="addressId" unique="true" class="Address"/> 27 </set> 28 29 b.多对一: 30 在子表中添加: 31 <join table="PersonAddress" optional="true"> 32 <key column="personId" unique="true"/> 33 <many-to-one name="address" column="addressId" not-null="true"/> 34 </join> 35 36 c.一对一: 37 在子表中添加: 38 <join table="PersonAddress" optional="true"> 39 <key column="personId" unique="true"/> 40 <many-to-one name="address" column="addressId" not-null="true" unique="true"/> 41 </join> 42 43 d.多对多: 44 <set name="addresses" table="PersonAddress"> 45 <key column="personId"/> 46 <many-to-many column="addressId" class="Address"/> 47 </set> 48 49 3.双向连接: 50 a.一对多/多对一: 51 在子表中添加:(子表跟单向的完全相同) 52 <many-to-one name="address" column="addressId" not-null="true"/> 53 在主表中添加:(主表比单向多一个inverse="true") 54 <set name="people" inverse="true"> 55 <key column="addressId"/> 56 <one-to-many class="Person"/> 57 </set> 58 59 b.一对一: 60 基于外键关联: 61 在子表中添加:(子表跟单向的完全相同) 62 <many-to-one name="address" column="addressId" unique="true" not-null="true"/> 63 在主表中添加:(主表比单向不同的是constrained="true"改成property-ref="address") 64 <one-to-one name="person" property-ref="address"/> 65 或者 66 基于主键关联的: 67 在子表中添加: 68 <one-to-one name="address"/> 69 在主表中添加: 70 <one-to-one name="person" constrained="true"/> 71 72 4.使用连接表的双向关联: 73 a.一对多/多对一 74 在子表中添加: 75 <set name="addresses" table="PersonAddress"> 76 <key column="personId"/> 77 <many-to-many column="addressId" unique="true" class="Address"/> 78 </set> 79 在主表中添加: 80 <join table="PersonAddress" inverse="true" optional="true"> 81 <key column="addressId"/> 82 <many-to-one name="person" column="personId" not-null="true"/> 83 </join> 84 85 b.一对一: 86 在子表中添加: 87 <join table="PersonAddress" optional="true"> 88 <key column="personId" unique="true"/> 89 <many-to-one name="address" column="addressId" not-null="true" unique="true"/> 90 </join> 91 在主表中添加: 92 <join table="PersonAddress" optional="true" inverse="true"> 93 <key column="addressId" unique="true"/> 94 <many-to-one name="address" column="personId" not-null="true" unique="true"/> 95 </join> 96 97 c.多对多: 98 <set name="addresses"> 99 <key column="personId"/> 100 <many-to-many column="addressId" class="Address"/> 101 </set> 102 103 <set name="people" inverse="true"> 104 <key column="addressId"/> 105 <many-to-many column="personId" class="Person"/> 106 </set>