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

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>就可

相关推荐