您的位置:首页 > 其它

ssh学习:hibernate关系映射(1)

2016-02-16 11:45 375 查看
hibernate中一一关系映射
1.基于外键的一对一关联映射:

1.单向的关联映射

单向的关联映射中,主控端知道关联的另一表是谁,而被控端不知道被谁给关联了。

怎么配置呢?

在数据持久化类当中,被控端与无关联时候一样的写法,主控端则是应用被控端的对象,并实现get/set方法

Xxx.hbm.xml中,被控端也无需任何的改变,主控端则是添加<many-to-one></many-to-one>标签,

其中name值为应用被控端属性的属性名 column值为外键名 unique属性值来决定是否是一一对应,true则是一一对应,false否

持久化对象Java 

被控端:

public class Address  {
private int id;
private String addr;
//省去get/set方法
}

 

主控端:

public class Account  {
private int id;
private String name;
private Address address;
//省去get/set方法
}

 

Xxx.hbm.xml文件配置:

被控端:

<hibernate-mapping>
<class name="com.usc.geowind.lilin.bean.Address" table="Adress">
<id name="id" column="id" >
<generator class="native"></generator>
</id>
<property name="addr" column="addr"></property>

</class>
</hibernate-mapping>

 
 

主控端:

<hibernate-mapping>
<class name="com.usc.geowind.lilin.bean.Account" table="Account">
<id name="id" column="id" >
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- name值为对象中属性名 coulumn为外键 unique为是否一对一 -->
<many-to-one name="address" column="address_id" unique="true"></many-to-one>
</class>
</hibernate-mapping>

 

 

2.双向的关联映射

双向的关联映射当中,主控端知道关联的另外一端是谁,而且被控端也知道被谁给关联上了。

在双向关联时候,主控端的设计与单向关联是无异,被控端中,持久化对象中添加主控端的对象引用,

Xxx.hbm.xml文件中添加标签<one-to-one></one-to-one>,属性property-ref的值为主控端引用被控端的属性属性名

被控端:

public class Address  {
private int id;
private String addr;
private Account account;
//省去get/set方法
}

 

Xxx.hbm.xml文件配置:

在字段属性下添加该属性,其余不变

<hibernate-mapping>
<class name="com.usc.geowind.lilin.bean.Address" table="Adress">
<id name="id" column="id" >
<generator class="native"></generator>
</id>
<property name="addr" column="addr"></property>
<!-- onetoone 指定一一关联 property-ref 反向引用主控端的属性名,而不是外键 -->
<one-to-one name="account" property-ref="address"></one-to-one>
</class>
</hibernate-mapping>

 

2.基于主键的关联映射:

1.单向的关联映射

基于主键的关联映射是两表不依靠外键,靠被另一表的主键来实现的一一映射关系。

被控端的配置与基于外键的被控端的配置一样,但是主控端的配置却有着相当大的区别。

在持久化的对象当中,还是要引用被控端的对象,在Xxx.xml文件配置中,主键的配置如下:

<!-- 外键 -->
<generator class="foreign">
<!-- 指明外键的属性值,被引用的对象的属性名 -->
<param name="property">idCard</param>
</generator>

 

并且引用外键的标签使用<one-to-one></one-to-one>,其中的属性constrained的值设置为true,是告诉当前的主键使用的是被控端的主键

持久化对象Java

主控端:

public class CItizen {
private int id;
private String name;
private IDCard idCard;
//省去get/set方法
}

 

被控端:

public class IDCard {
private int id;
private int num;
//省去get/set方法
}

 

Xxx.hbm.xml文件配置:

主控端:

<hibernate-mapping>
<class name="com.usc.geowind.lilin.bean.onetoonePK.CItizen"
table="CItizen">
<id name="id" column="id">
<!-- 外键 -->
<generator class="foreign">
<!-- 指明外键的属性值,被引用的对象的属性名 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name" column="name"></property>
<!--constrained 是否告诉当前主键你的值是另外一个表的之间值 -->
<one-to-one name="idCard" constrained="true"></one-to-one>

</class>
</hibernate-mapping>

 

被控端:

<hibernate-mapping>
<class name="com.usc.geowind.lilin.bean.onetoonePK.IDCard" table="IDCrad">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="num" column="num"></property>
</class>
</hibernate-mapping>

 

2.双向的关联映射

在配置上与基于主键的单向关联关系的区别:

在JavaBean对象中,引用主控端的对象并实现get/set方法。在Xxx.hbm.xml文件配置:

继续使用<one-to-one></one-to-one>标签

实例:

被控端:

public class IDCard {
private int id;
private int num;
private CItizen cItizen;
//省去get/set方法
}

 

Xxx.hbm.xml中,在属性字段中添加标签

<one-to-one name="cItizen"></one-to-one>就可

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: