人和身份证之间就是一个典型的一对一关联关系。实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式

首先看他们的实体类

Person类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package entity;
 
public class Person {
    private Integer id;
    private String name;
    private IdCard idCard;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public IdCard getIdCard() {
        return idCard;
    }
    public void setIdCard(IdCard idCard) {
        this.idCard = idCard;
    }
}

然后看IdCard类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package entity;
 
public class IdCard {
    private Integer id;
    private String number;
    private Person person;
     
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }
     
     
}

这里在Person类和IdCard类中分别有一个对方类型的属性。

然后看他们之间的关联关系映射,首先看Person.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 
<hibernate-mapping>
    <class name="entity.Person" table="Person" schema="MYHR">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <!-- idCard属性,IdCard类型,表达本类与IdCard的一对一关联 -->
        <!-- 采用基于外键的一对一,本方无外键方 -->
        <!-- property-ref属性:对方映射中外键类对应的属性名 -->
        <one-to-one name="idCard" class="entity.IdCard" property-ref="person">
        </one-to-one>
    </class>
</hibernate-mapping>

然后看一下IdCard.hbm.xml文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<hibernate-mapping>
    <class name="entity.IdCard" table="IdCard" schema="MYHR">
        <id name="id">
            <column name="ID"/>
            <generator class="assigned" />
        </id>
        <property name="number">
            <column name="NAME" not-null="true" />
        </property>
        <!-- person属性,Person类型,表示与Person类的一对一关联关系 -->
        <!-- 采用基于外键的一对一关联方式,本方有外键 -->
        <many-to-one name="person" column="personId" class="entity.Person" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

这样Person和IdCard之间的一对一关联关系就搭建好了,然后看一下测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package test;
 
import static org.junit.Assert.*;
 
import org.hibernate.Session;
import org.hibernate.Transaction;
 
import entity.IdCard;
import entity.Person;
import factory.HibernateSessionFactory;
 
public class Test {
 
    private Session session = null;
    private Transaction tran = null;
    @org.junit.Test
    public void save() {
        session = HibernateSessionFactory.getSession();
        tran = session.beginTransaction();
        try{
            //新建对象
            Person p = new Person();
            p.setId(1);
            p.setName("张三");
             
            IdCard idCard = new IdCard();
            idCard.setId(1);
            idCard.setNumber("10001");
             
            p.setIdCard(idCard);
            idCard.setPerson(p);
             
            session.save(p);
            session.save(idCard);
             
            tran.commit();
        }catch(Exception e){
            tran.rollback();
        }
    }
 
    @org.junit.Test
    public void Get() {
        session = HibernateSessionFactory.getSession();
        tran = session.beginTransaction();
        try{
            Person person = (Person) session.get(Person.class, 1);
            IdCard idCard = person.getIdCard();
            System.out.println(person.getName()+"身份证号:"+idCard.getNumber());
            tran.commit();
        }catch(Exception e){
            tran.rollback();
        }
    }
    //解除关系
    @org.junit.Test
    public void RemoveRelation() {
        session = HibernateSessionFactory.getSession();
        tran = session.beginTransaction();
        try{
            //从有外键方接触关联关系可以,不可以从无外键方解除
            IdCard idCard = (IdCard)session.get(IdCard.class, 1);
            idCard.setPerson(null);
            tran.commit();
        }catch(Exception e){
            tran.rollback();
        }
    }
    //删除
    @org.junit.Test
    public void DeleteRelation() {
        session = HibernateSessionFactory.getSession();
        tran = session.beginTransaction();
        try{
            //如果没有关联对方,可以直接删除。
            //如果有关联对方,且可以维护关联关系,他就会先删除关联关系,在删除自己。
            //如果有关联关系,且不能维护关联关系,所以会执行删除自己,并且抛出异常。
            IdCard idCard = (IdCard)session.get(IdCard.class, 1);
            session.delete(idCard);
            tran.commit();
        }catch(Exception e){
            tran.rollback();
        }
    }
}

这就是基于外键方式,基于主键的方式只需要在以上基础修改一下映射文件即可,下面分别看一下修改后的映射文件

首先看Person.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 
<hibernate-mapping package="entity">
    <class name="entity.Person" table="Person" schema="MYHR">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <!-- idCard属性,IdCard类型,表达本类与IdCard的一对一关联 -->
        <!-- 采用基于主键的一对一,本方无外键方 -->
        <one-to-one name="idCard" class="entity.IdCard"/>
       
    </class>
</hibernate-mapping>

然后看IdCard.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<hibernate-mapping package="entity">
    <class name="entity.IdCard" table="IdCard" schema="MYHR">
        <id name="id" type="int">
            <column name="ID" />
            <!-- 当使用基于主键的一对一映射时,有外键方的主键生成策略是foreign, -->
            <!-- 参数property:生成主键值时所根据的对象 -->
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
        </id>
        <property name="number" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <!-- person属性,Person类型,表示与Person类的一对一关联关系 -->
        <!-- 采用基于主键的一对一关联方式,本方有外键 -->
        <one-to-one name="person" class="entity.Person"
            constrained="true" />
    </class>
</hibernate-mapping>

Hibernate关联关系映射之一对一关联关系的更多相关文章

  1. Hibernate关联关系映射之一对一(主键关联)

    在业务成的域模型中,类和类之间最普遍的关系就是关联关系,而关联也是有方向的. 就以例子来说明:一个人对应一张身份证.对其进行增删改. 对于人在数据创建表的时候,我们就给他两个字段,一个是id号,一个就 ...

  2. Hibernate之基于主键映射的一对一关联关系

    1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ...

  3. Hibernate 基于外键映射的一对一关联关系随手记

    //有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...

  4. Hibernate关联映射1:一对一主键关联

    2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...

  5. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  6. 一对一关联关系基于主键映射的异常 IdentifierGenerationException

    具体异常:org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one pro ...

  7. [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. mybatis一对多关联关系映射

    mybatis一对多关联关系映射 一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可.在实体类中就是反过来,在少的一方添加多的一方,声明一个List 属性名 作为少的一方的属性. 用户和订单 ...

  9. 分享知识-快乐自己:Hibernate 关联映射

    关联关系映射--概念: 关联关系是使用最多的一种关系,非常重要.在内存中反映为实体关系,映射到DB中为主外键关系. 实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键 ...

随机推荐

  1. 解决finalflares 安装成功后无法显示问题

    按照网上的安装方法:http://blog.sina.com.cn/s/blog_e9370eb80101gias.html 安装插件并破解,安装过程没有任何错误,但是打开max2012始终看不到这个 ...

  2. 赢在面试之Java多线程(十一)

    121,什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完 ...

  3. 项目分析(GS,NET,NGP关系)

    看了两天,这三者之间的关系好像是这样的,因为GS和net在同一台机器上,所以用共享内存通信,毕竟共享内存通信是最快的进程间通信的方式,而NGP是属于客户端的,Net是属于服务器的,他与Net进程是基于 ...

  4. 隐藏内容但仍保持占位的css写法

    通常显示和隐藏内容都会用display:block;和display:none; 如果想要保持内容的占位可以用visbility:visible; 和visiblity:hidden;来控制内容的显示 ...

  5. 利用python实现TCP和UDP服务器

    利用python的socket模块可以实现基本的网络编程,并且只限于一对一的连接.当然,也可以在其基础上实现一个网络服务器,但由于太底层这种做法不被推荐.其实如果要实现一个网络服务器很简单,调用pyt ...

  6. selectedIndex返回被选中的option的index.

    / <label for="city">城市</label> <select id="city" name="schoo ...

  7. Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6)

    Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6) 大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配置DNS ...

  8. java开发的zimg客户端

    1.zimg的安装部署 最开始的时候是下载zimg的源码安装的,由于zimg依赖项众多,没有安装成功,刚好那期间在学习docker,于是docker search zimg一下,惊奇的发现有zimg镜 ...

  9. (转)VLC播放RTP打包发送的.264文件

    VLC播放RTP打包发送的.264文件 1,要有一个发送RTP包的264文件的服务器; 具体代码如下: rtp.h #include <WinSock2.h> #pragma commen ...

  10. STL sort “invalid operator <”

    跟踪了下,是比较函数(下面的_Pred)的问题: template<class _Pr, class _Ty1, class _Ty2> inline bool _Debug_lt_pre ...