一对一关联
假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系
1,通过主键关联(个人偏向另外一种)
User.hbm.xml文件配置
<id name="userid" type="java.lang.Integer"> ???????????<column name="userid" /> ???????????<!-- 主键关联,将主键生成策略改为foreign,表明由关联类来生成主键, ???????????即直接使用另外关联类的主键值,该实体类不能生成主键 --> ????????????<generator class="foreign" /> ????????????<para name="property">address</para><!-- ?--> ???????</id> ??????????????<property name="name" type="java.lang.String"> ???????????<column name="name" length="12" /> ???????</property> ???????<property name="password" type="java.lang.String"> ???????????<column name="password" length="16" /> ???????</property>
<one-to-one name="address" class="Address" constrained="true"></one-to-one></span>
Addrss.hbm.xml文件配置
<id name="addressid" type="java.lang.Integer"> ?????????????<column name="addressid" /> ?????????????<generator class="identity" /> ?????????</id> ????????????????<property name="addressinfo" type="java.lang.String"> ?????????????<column name="addressinfo" length="12" /> ?????????</property>
2通过外键关联
两张表主键不同,通过给一张表添加外键列来保持一对一关系,所以在user 表中加入address_id
直接在原始的User配置文件加入下行代码
<!-- class属性:另外个实体类,将其的address属性映射为address表的外键address_id, ?????????unique指定一对一映射 ??????????--> ?????????<many-to-one name="address" class="Address" unique="true"> ?????????<!-- 外键 --> ?????????????<column name="address_id"></column> ?????????</many-to-one>
一对多关联映射
还是上方例子为例,一个用户拥有多个地址
第一步:在一的一方表示出多(即在用户中表示多)
在User.java表示多,生成get,set方法
private Set<Address> setAddress = new HashSet<Address>(); ???????public Set<Address> getSetAddress() { ?????????return setAddress; ?????} ?????public void setSetAddress(Set<Address> setAddress) { ?????????this.setAddress = setAddress; ?????}
第二步:在Address.java表示一
private User user; ?public User getUser() { ?????return user; ?} ?public void setUser(User user) { ?????this.user = user; ?} ?
第三步:配置Uesr.hbm.xml与Address.hbm.xml的基本映射
第四步:在一的配置文件(User.hbm.xml)配置多的一方
<!--set集合名称 --> ?????<!--hibernate机制,双向维护外键 ??????columen 外键名称--> ??????<key column="user_address"></key> ??????<one-to-many class="Address全路径"/> ?</set>
第五步:在多的配置文件(Address.hbm.xml)配置一的一方
<!--name属性 写address.java表示的user--> ?????<many-to-one name="user" class="User全路径" ?column="外键名"></many-to-one>
多对多的关联映射
多对多一般创建第三张中间表来维护两个表之间关系
场景:公司里面一个用户有多个角色,一个角色就多个用户
第一步:创建实体类对象(user ,role)
第二步:在user.java表示role和在role.java表示user
user.java表示role
private Set<Role> setRole = new HashSet<Role>(); ?public Set<Role> getSetRole() { ?????return setRole; ?} ?public void setSetRole(Set<Role> setRole) { ?????this.setRole = setRole; ?}
role.java表示user
private Set<User> setUser = new HashSet<User>(); ???????????public Set<User> getSetUser() { ?????????return setUser; ?????} ?????public void setSetUser(Set<User> setUser) { ?????????this.setUser = setUser; ?????}
第三步:配置两个类的基本映射
第四步:分别在配置文件中配置
user配置role
<!-- ??????name ?角色set集合名称 ?????table 第三张表的名称 ??????--> ?????<set name="setRole" table="t_ub"> ?????<!-- 配置当前映射文件在第三张表外键名称 --> ?????????<key column="uid"></key> ?????????<many-to-many class="路径" column="rid"></many-to-many> ?????</set> ?
role配置user
<!-- ??name ?角色set集合名称 ?table 第三张表的名称 ??--> ?<set name="setUser" table="t_ub"> ?<!-- 配置当前映射文件在第三张表外键名称 --> ?????<key column="bid"></key> ?????<many-to-many class="路径" column="uid"></many-to-many> ?</set> ?
由于t_user表与t_role没有外键关联,可以直接进行crud操作,两表的关系通过第三张表来维护(后面会写第三张表的维护)
Hibernate学习笔记(3)---hibernate关联关系映射
原文地址:http://www.cnblogs.com/durui/p/7582281.html