关系映射总结
一个人拥有多张卡,中间表是PERSON_CARD,
双向多对一关系
中间表一端的映射
<set name="set" table="PERSON_CARD" inverse="true">
<key column="person_id"></key>
<many-to-many column="CARD_ID" unique="true" class="com.link6.Card"></many-to-many>
</set>
多端的映射理解:set集合用set元素映射,key指定当前表主键在中间表中的外键映射列,
many-to-many指定set集合数据在表中的映射列,
这里是多对一映射,set映射的列应该是不能重复的,class指定set集合保存的元素类型,这里用many-to-many,不用其他的理解one-to-one 这个用在一对一的关系中one-to-many 这个用在一对多的关系中,设置的列在many-to-one 这个用在多对一的关系中,设置unique可以用在一对一的关系中
<join table="PERSON_CARD">
<key column="CARD_ID"></key>
<many-to-one name="person" column="PERSON_ID" class="com.link6.Person" ></many-to-one>
</join>
理解:
无中间表这里的类属性用join来映射到中间表中,key指定当前类关联的表的主键在中间表的映射的外键的列,many-to-one name属性是类的字段,column指定在中间表中的关联列,class指定类类字段的类型
一端映射
<set name="set" inverse="true">
<key column="person_id"></key>
<one-to-many class="com.link6.Card" />
</set>
理解:
key指定当前类对应的表在多端关联的列,one-to-many属性不能设置column和name属性,
set集合里面元素关联的就是class属性关联的类对应的表,
所以免去了name和column属性
多端映射
<many-to-one name="person" column="PERSON_ID" class="com.link6.Person"></many-to-one>
理解:
指定类字段在当前类对应表中映射的列
双向一对一关系映射
一个人有一张卡
有中间表
<join table="PERSON_CARD" optional="true">
<key column="CARD_ID" unique="true"></key>
<many-to-one name="person" unique="true" column="PERSON_ID" class="com.link6.Person"></many-to-one>
</join>
<join table="PERSON_CARD" inverse="true" optional="true">
<key unique="true" column="PERSON_ID"></key>
<many-to-one name="card" unique="true" column="CARD_ID" class="com.link6.Card"></many-to-one>
</join>
理解:
无中间表两端的配置文件都是采用join连接到中间表,用key指定当前类关联的表的主键,
在中间表的外键,同时设置为unique约束
many-to-one 设置类字段在中间表关联的列,同样也是设置为unique约束
唯一主键映射
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="foreign">
<param name="property">card</param>
</generator>
</id>
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
理解:
两个类对应的id配置,其中一个使用native生成方式,
另外一个使用外键生成器,根据关联表的id生成为一的id主键,
<one-to-one name="card" class="com.link6.Card"></one-to-one>
<one-to-one name="person" class="com.link6.Person" ></one-to-one>
理解:
使用one-to-one映射一对一关系,不用在表中生成辅助的列,hibernate会根据主键的关系,进行查找
唯一外键映射
<many-to-one name="card" class="com.link6.Card" column="CARD_ID" unique="true"></many-to-one>
<one-to-one name="person" class="com.link6.Person" property-ref="card" ></one-to-one>
理解:
many-to-one 指定在当前表中生成的外外键列,并设置为uniqueone-to-one 默认是关联指定class对应表的主键property-ref指定关联出主键以外的字段
双向的多对多
一张卡关联多个人,一个人拥有多张卡
含有中间表
<set name="set" inverse="true">
<key column="PERSON_ID"></key>
<many-to-many class="com.link6.Card" column="CARD_ID"></many-to-many>
</set>
<set table="PERSON_CARD" name="set">
<key column="CARD_ID"></key>
<many-to-many column="PERSON_ID" class="com.link6.Person"></many-to-many>
</set>
理解:
这里使用set元素匹配set集合,使用key匹配当前表的主键,使用many-to-many匹配set集合元素在中间表中关联的列