您的位置:首页 > 其它

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

2014-07-03 16:44 369 查看
关系映射指的是对象之间的关系,并不是指数据库的关系

一对一
(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属性可以找到对应的关联对象,
而单向找不到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: