Hibernate学习笔记(3)---hibernate关联关系映射
一对一关联
假设有两个持久化类(实体类)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操作,两表的关系通过第三张表来维护(后面会写第三张表的维护)