09hibernate hibernate的关系映射之OneToOne(重点)

关系映射指的是对象之间的关系,并不是指数据库的关系

一对一
	(1)单向外键关联:
	a.annotation版本:
		public class Husband
		{
			private int id;
			private String name;
			@OneToOne
			@JoinColumn(name="wifeId")//指定外键名
			private Wife wife;
			//只有在Husband表中有一个外键指向Wife表
		}
		public class Wife
		{
			private int id;
			private String name;
		}
	b.xml版本:
		<class name="com.hibernate.StuIdCard">
			<id name="id">
				<generator class="native"></generator>
			</id>
			<many-to-one name="student" column="studentId" unique="true"></many-to-one>
			//unique="true"指明StuIdCard必须唯一,所以此时是一对一关联
			//column="studentId"指明外键名称
		</class>	

	(2)单向主键关联:(不重要)
	a.annotation版本:	
		public class Husband
		{
			private int id;
			private String name;
			@OneToOne
			@PrimaryKeyJoinColumn
			private Wife wife;
		}
		public class Wife
		{
			private int id;
			private String name;
		}
	b.xml版本:
		<class name="com.hibernate.StuIdCard">
			<id name="id">
				<generator class="native">
					<param name="property">student</param>
				</generator>
			</id>
			<one-to-one name="student" constrained="true"></one-to-one>			
		</class>//constrained="true"创建主键关联关系,主键生成参考Student的主键

	(3)双向外键关联:
	a.annotation版本://规律:凡是双向关联,必设mappedBy
		public class Wife
		{
			private int id;
			private String name;
			@OneToOne(mappedBy="wife")
			private Husband husband;
			//mappedBy="wife" 被Husband类的wife属性做了映射,
			//即Husband类的wife属性才是主导,可以忽略此处的设置
			//此时Wife表中不再生成husband字段
		}
		public class Husband
		{
			private int id;
			private String name;
			@OneToOne
			private Wife wife;
		}//两个类中都有指向对方的外键
	b.xml版本:
	StuIdCard的xml不变,还需增加
	<class name="com.hibernate.Student">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<one-to-one name="stuIdCard" property-ref="student"></one-to-one>
		//此时只在stuIdCard中生成外键指向Student类
		//property-ref相当于mappedBy,stuIdCard类的student属性作为主导
	</class>

	(4)双向主键关联:(不重要)
	a.annotation版本:
		public class Husband
		{
			private int id;
			private String name;
			@OneToOne
			@PrimaryKeyJoinColumn
			private Wife wife;
		}
		public class Wife
		{
			private int id;
			private String name;
			@OneToOne
			@PrimaryKeyJoinColumn
			private Husband husband;
		}

	b.xml版本:
	StuIdCard的xml文件不变
	<class name="com.hibernate.Student">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<one-to-one name="stuIdCard" property-ref="student"></one-to-one>
	</class>

	注意:OneToOne的单向和双向在数据库没有区别
		  在java程序里的区别是:
			双向关联的时候wife对象通过它的husband属性可以找到对应的关联对象,
			而单向找不到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值