关系映射是指对象之间的关系,并不是指数据库的关系,关系映射是解决当对象处于以下关系之一时,数据库表该如何映射的问题

(一)一对一单向外键关联

1、注解方式配置

创建一个Husband类和Wife类

Husband类:(getWife方法上加注解OneToOne)

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne; @Entity
public class Husband { private int id; private String name; private Wife wife; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
@OneToOne
  @JoinColumn(name="wifeId")//默认生成的外键id是wife_id在这里使用JoinColumn注解name属性指定为wifeId
public Wife getWife() {
return wife;
} public void setWife(Wife wife) {
this.wife = wife;
}
}

Wife类

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; @Entity
public class Wife { private int id; private String name; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

然后创建一个测试类HibernateMappingTest

package cn.orlion.hibernate.model;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.Test; public class HibernateORMappingTest { @Test
public void testSchemaExport(){ new SchemaExport(new AnnotationConfiguration().configure()).create(true , true);
} }

运行testSchemaExport可以在控制台看到建表语句:

2、xml方式配置

首先创建一个Student类和StuIdCard(学生证)

Student类:

package cn.orlion.hibernate.model;

public class Student {

    private int id;

    private String name;

    private String sex;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
}
}

StuIdCard:

package cn.orlion.hibernate.model;

public class StuIdCard {

    private int id;

    private int num;

    private Student student;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getNum() {
return num;
} public void setNum(int num) {
this.num = num;
} public Student getStudent() {
return student;
} public void setStudent(Student student) {
this.student = student;
}
}

然后创建两个配置文件Student.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.orlion.hibernate.model">
<class name="cn.orlion.hibernate.model.Student">
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property> <property name="sex"></property>
</class>
</hibernate-mapping>

StuIdCard.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.orlion.hibernate.model">
<class name="cn.orlion.hibernate.model.StuIdCard">
<id name="id">
<generator class="native"></generator>
</id> <property name="num" /> <many-to-one name="student" column="studentId" unique="true"></many-to-one>
<!-- many-to-one是当前类即StuIdCard类相对于Student类是多对一关系 (多个学生证对应一个学生) ,unique=true限定为了一对一 -->
</class>
</hibernate-mapping>

然后运行测试类HibernateORMappingTest类的testSchemaExport方法可以在控制台看到建表语句:

(二)一对一双向外键关联

1、注解方式设置

双向外键关联注解方式设置是在wife类中添加husband属性,在getHusband()方法上添加注解@OneToOne(mappedBy="wife")//mappedBy="wife"表示Husband中wife属性已经做映射了,不用管当前类的设置(不再从wife表中生成指向husband的外键)注:如果不写mappedBy="wife"会在wife表中生成一个husband_id外键,这是多余的。

Wife类:

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne; @Entity
public class Wife { private int id; private String name; private Husband husband; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
@OneToOne(mappedBy="wife")//mappedBy="wife"表示Husband中wife属性已经做映射了,不用管当前类的设置(不再从wife表中生成指向husband的外键)
public Husband getHusband() {
return husband;
} public void setHusband(Husband husband) {
this.husband = husband;
} }

2、xml方式配置
在Student.hbm.xml配置文件中添加<one-to-one name="stuIdCard" property-ref="student"></one-to-one>,在Student类中添加stuIdCard属性:

Student类:

package cn.orlion.hibernate.model;

public class Student {

    private int id;

    private String name;

    private String sex;

    private StuIdCard stuIdCard;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public StuIdCard getStuIdCard() {
return stuIdCard;
} public void setStuIdCard(StuIdCard stuIdCard) {
this.stuIdCard = stuIdCard;
} }

Student.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.orlion.hibernate.model">
<class name="cn.orlion.hibernate.model.Student">
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property> <property name="sex"></property> <one-to-one name="stuIdCard" property-ref="student"></one-to-one>
<!-- one-to-one只会在一边生成主键,如果这里设置为many-to-one会在student表中生成多余的stuidcard_id外键 -->
<!-- property-ref="student" 类似于mappedby="student"是指在StuIdCard中student属性已经设置好了关联关系 -->
</class>
</hibernate-mapping>

注:一对一单向和双向在数据库中表现没有区别

主键关联是指的一个表的主键和另外一个表的主键关联
外键关联是指的一个表的主键和另外一个表的非主键关联

(三)一对一单向主键关联

xml方式配置:

创建Student类

package cn.orlion.hibernate.model;

public class Student {

    private int id;

    private String name;

    private String sex;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
}
}

StuIdCard类:

package cn.orlion.hibernate.model;

public class StuIdCard {

    private int id;

    private int num;

    private Student student;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getNum() {
return num;
} public void setNum(int num) {
this.num = num;
} public Student getStudent() {
return student;
} public void setStudent(Student student) {
this.student = student;
}
}

Student.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.orlion.hibernate.model">
<class name="cn.orlion.hibernate.model.Student">
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property> <property name="sex"></property>
</class>
</hibernate-mapping>

StuIdCard.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.orlion.hibernate.model">
<class name="cn.orlion.hibernate.model.StuIdCard">
<id name="id">
<generator class="foreign"><!-- StuIdCard的主键应该靠外键来生成,StuIdCard -->
<param name="property">student</param><!-- 依靠student属性的关联关系 -->
</generator>
</id> <property name="num" /> <one-to-one name="student" constrained="true"></one-to-one>
<!-- constrained="true"用来生成外键约束,不加这个属性就不会加外键 -->
</class>
</hibernate-mapping>

运行:

(四)一对一双向主键关联

注解方式配置:

Husband类:

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn; @Entity
public class Husband { private int id; private String name; private Wife wife; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
@OneToOne
@PrimaryKeyJoinColumn
public Wife getWife() {
return wife;
} public void setWife(Wife wife) {
this.wife = wife;
}
}

Wife类:

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne; @Entity
public class Wife { private int id; private String name; private Husband husband; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
@OneToOne
@PrimaryKeyJoinColumn
   public Husband getHusband() {
return husband;
} public void setHusband(Husband husband) {
this.husband = husband;
} }

(五)联合主键映射

Wife类:

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass; @Entity
@IdClass(WifePK.class)
public class Wife { private int id; private String name; private String age; @Id
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
@Id
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} }

WifePK:

package cn.orlion.hibernate.model;

public class WifePK implements java.io.Serializable{

    private int id;

    private String name;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

Husband类:

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.OneToOne; @Entity
public class Husband { private int id; private String name; private Wife wife; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
@OneToOne
@JoinColumns(
{
@JoinColumn(name="wifeId" , referencedColumnName="id"),
@JoinColumn(name="wifeName" , referencedColumnName="name")
}
)
public Wife getWife() {
return wife;
} public void setWife(Wife wife) {
this.wife = wife;
}
}

运行结果:

hibernate(六)一对一映射的更多相关文章

  1. hibernate中一对一映射

    一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...

  2. 9.hibernate的一对一映射

    一.hibernate的一对一按照外键映射 1.创建如下sql脚本: --员工账号表 create table USERS1 ( USERID ) not null, USERNAME ), USER ...

  3. Hibernate的一对一映射

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...

  4. Hibernate(七)一对一映射

    一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...

  5. Hibernate表关系映射之一对一映射

    一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...

  6. hibernate笔记--基于主键的单(双)向的一对一映射关系

    上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...

  7. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  8. Hibernate一对一映射关联

    Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...

  9. Hibernate中的一对一映射

    1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...

  10. 【Hibernate 3】一对一映射配置

    一.一对一映射简介 一对一关联映射有两种实现策略: 第一种:主键关联,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 ...

随机推荐

  1. java解析json

    1:下载另外一个Java的小包就可以了: http://www.JSON.org/java/json_simple.zip 里面有源码和文档例题和编程的lib包:编程只需要json_simple.ja ...

  2. css中关于position属性的探究(原创)

    关于position属性的设置,头脑中一直觉得不是很清楚,所以借助这次机会单独自己测试了一下,记作学习笔记.   首先,css的position属性包含下面四种设置情况: static:默认属性.指定 ...

  3. android TCP 客户端(仅接收数据)

    配合log4net使用,用来接收调试信息.因此,此客户端只管通过TCP接收字符串数据,然后显示在界面上. 接收TCP数据 try { Socket s = new Socket("192.1 ...

  4. Jquery的multifile使用随记

    1.多文件上传: 2.如上几个验证不重复,和限制上传数量的验证显示的是英文,改成中文文本时,如果不用国标解码,到时候提示框会出现乱码现象.所以一般需要中文显示的时候,我们应该这样做: 拿denied做 ...

  5. iOS一些关于日历的问题

    int CalculateDays(int ys, int ms, int ds, int ye, int me, int de) { int days = CalcYearRestDays(ys, ...

  6. 书TO BE READED

    Books Created Wednesday 10 August 2011 1.<你的降落伞是什么颜色> 在求职书里面,我觉得这本书是最接近于圣经的. 第一版出现大概还是上世纪70年代末 ...

  7. fallacies of distributed computing

    The network is reliable. Latency is zero. Bandwidth is infinite. The network is secure. Topology doe ...

  8. 浅析Ajax跨域原理及JQuery中的实现分析

    AJAX 的出现使得网页可以通过在后台与服务器进行少量数据交换,实现网页的局部刷新.但是出于安全的考虑,ajax不允许跨域通信.如果尝试从不同的域请求数据,就会出现错误.如果能控制数据驻留的远程服务器 ...

  9. 译文---C#堆VS栈(Part Three)

    前言 在本系列的第一篇文章<C#堆栈对比(Part Two)>中,介绍了值类型和引用类型在参数传递时的不同,本文将讨论如何应用ICloneable接口实现去修复引在堆上的用变量所带来的问题 ...

  10. 【面试必备】CSS盒模型的点点滴滴

    从接触CSS布局开始,就一直在听盒模型的概念了,网上的文章有很多,深浅不一.有些人会认为盒模型很简单,不就是border.margin.padding.content嘛,一个元素所占的空间就是把它们都 ...