第一种一对一

person和card,card的id即作为主键,又作为外键 

// 各村对方的一个对象
public class Person { private Integer id;
private String name;
private Card card;
}
public class Card { private Integer id;
private String cardnum;
private Person person;
}

xxx.hbm.xml 的配置

记得在总配置文件中添加这两个配置文件 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Card" table="card">
<id name="id">
<!-- 主键生成策略变成foreign,表示又当主键又当外键 -->
<generator class="foreign">
<!-- 这个person是属性,指明用card这个类的person属性对应的表的主键作外键 -->
<param name="property">person</param>
</generator>
</id>
<property name="cardnum"/>
<one-to-one name="person" class="Person"/>
</class> </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Person" table="person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- cascade="delete"表示删除人的时候把卡删了 -->
<one-to-one cascade="delete" name="card" class="Card"/> </class> </hibernate-mapping>

程序执行

        Person p = new Person();
p.setUsername("tom"); Card c = new Card();
c.setCardnum("12");
c.setPerson(p); session.save(p);
session.save(c);
/* 这时候有两条sql,都是insert,改变save(p),save(c)的顺序式没用的
因为card的insert必须要有id,id不能为空,因为它作为主键,所以程序只能
先save(p)*/ Person p = new Person();
p.setUsername("tom"); Card c = new Card();
c.setCardnum("12"); p.setCard(c); session.save(p);
session.save(c); /* 这样做就会报错了,因为主键的生成策略是从card找person属性
所以这种情况就只能让又当主键又当外键的那个表来维护关系 */

查询     这种情况下的查询都是联接查询,有捆绑性

Card card = (Card) session.get(Card.class, 2);
System.out.println(card.getCardnum());
System.out.println(card.getPerson().getName()); Person p = (Person) session.get(Person.class, 2);
System.out.println(p.getName());
System.out.println(p.getCard().getCardnum());

删除

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Person" table="person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- cascade="delete"表示删除人的时候把卡删了 -->
<one-to-one cascade="delete" name="card" class="Card"/> </class> </hibernate-mapping>

----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------

第二种一对一,是一对多或者多对一的特殊情况,具有延迟加载的能力

dept和Employee,dept中有eid,Employee中有deptid 

// 各村对方的一个对象
public class Dept { private Integer id;
private String name;
private Employee employee;
}
public class Employee { private Integer id;
private String name;
private Dept dept;
}

xxx.hmb.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Dept" table="dept">
<id name="id">
<generator class="native"/>
</id> <property name="name"/>
<!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
<many-to-one name="employee" class="Employee" unique="true" column="eid"/> </class> </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id> <property name="name"/>
<!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
<many-to-one name="dept" class="Dept" unique="true" column="deptid"/> </class> </hibernate-mapping>

程序执行

Employee e = new Employee();
e.setName("jack"); Dept d = new Dept();
d.setName("hr"); d.setEmployee(e); e.setDept(d); session.save(e);
session.save(d);

请看这里,这是双向维护关系,而且必须双向维护关系,不可避免的会多一条update语句

hibernate 数据关联一对一的更多相关文章

  1. hibernate 数据关联一对一 3.2

    第一种一对一 person和card,card的id即作为主键,又作为外键  // 各村对方的一个对象 public class Person { private Integer id; privat ...

  2. hibernate 数据关联一对多 3.1

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  3. hibernate 数据关联一对多

    一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...

  4. hibernate 数据关联多对多 4.1

    多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...

  5. hibernate 数据关联多对多

    多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...

  6. hibernate之关于一对一单向,双向关联映射

    [hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...

  7. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

  8. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  9. 初识Hibernate之关联映射(二)

    上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...

随机推荐

  1. maven编译问题-maven项目运行时找不到文件,解决方案之一

    问题描述:以上信息是tomcat在启动项目的时候报的错误信息,发现没有找到配置文件,实际上配置文件在项目中是存在的,但是,在编译过程中,配置文件没有能加载到编译后的项目中.就造成了,找不到这些怕配置文 ...

  2. HDU 4824 Disk Schedule

    //

  3. 扩展 Yii2 自带的日志组件

    <?php /** * author : forecho <caizhenghai@gmail.com> * createTime : 2015/12/22 18:13 * desc ...

  4. 全自动安装mongoDB数据库的shell脚本

    最近在研究mongoDB数据库,写了个全自动安装mongoDB数据库的shell脚本,仅供参考,欢迎拍砖,内容如下: #!/bin/bash # shell的执行选项: # -n 只读取shell脚本 ...

  5. 牛客小白月赛1 B 简单题2 【数学】

    题目链接 https://www.nowcoder.com/acm/contest/85/B 思路 这个 也是 E AC代码 #include <cstdio> #include < ...

  6. DEV开发之汉化

    public class Chinese { public Chinese() { Localizer.Active = new XtraEditors_CN(); GridLocalizer.Act ...

  7. DEV开发之界面皮肤

    最终效果:正文本人的环境是 VS2013+DEV 13.21.第一步,新建项目,(忽略)???2.修改Form1.cs的基类,Form修改为DevExpress.XtraBars.Ribbon.Rib ...

  8. 【leetcode刷题笔记】Valid Number

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  9. STM32 MCO时钟输出配置实验

    STM32的PA.8引脚具有复用功能——时钟输出(MCO), 该功能能将STM32内部的时钟通过PA.8输出. 操作流程: 1).设置PA.8为复用AF模式. RCC_AHB1PeriphClockC ...

  10. P4022 [CTSC2012]熟悉的文章

    题目 P4022 [CTSC2012]熟悉的文章 题目大意:多个文本串,多个匹配串,我们求\(L\),\(L\)指(匹配串中\(≥L\)长度的子串出现在文本串才为"熟悉",使得匹配 ...