hibernate 数据关联一对一
第一种一对一
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 数据关联一对一的更多相关文章
- hibernate 数据关联一对一 3.2
第一种一对一 person和card,card的id即作为主键,又作为外键 // 各村对方的一个对象 public class Person { private Integer id; privat ...
- hibernate 数据关联一对多 3.1
一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...
- hibernate 数据关联一对多
一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...
- hibernate 数据关联多对多 4.1
多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...
- hibernate 数据关联多对多
多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...
- hibernate之关于一对一单向,双向关联映射
[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...
- hibernate 关系映射之 单向外键关联一对一
这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...
- Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...
- 初识Hibernate之关联映射(二)
上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...
随机推荐
- MySql四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- [闲来无事,从头再来][C51篇]导读
目 的: 通过学习C51,熟悉单片机,熟悉C语言,熟悉单片机系统的外部电路. 方 法: 通过看书和使用板子做实验来进行学习 参考资料: <新概念51单片机C语言教程& ...
- activiti基础--1------------------------生成.bpmn和.png以及部署流程定义
helloworld.dbmn <?xml version="1.0" encoding="UTF-8"?> <definitions xml ...
- Python socket TCPServer Demo
#coding:utf-8 from SocketServer import TCPServer,BaseRequestHandler import traceback class MyBaseReq ...
- 数据库抽象层PDO
通过数据库抽象层PDO可以访问多个数据库 //数据库抽象层PDO //造DSN:驱动名:dbname=数据库名:host=服务器地址 $dsn = "mysql:dbname=mydb;ho ...
- Dockerfile指令及docker的常用命令
DockerfileFROM: FROM <image> FROM <image>:<tag> MAINTAINER: MAINTAINER <name> ...
- MySQL创建用户并授权及撤销用户权限
这篇文章主要介绍了MySQL创建用户并授权及撤销用户权限.设置与更改用户密码.删除用户等等,需要的朋友可以参考下 MySQL中创建用户与授权的实现方法. 运行环境:widnows xp profess ...
- Linux Network Namespace
Linux Network Namespaces Linux kernel在2.6.29中加入了namespaces,用于支持网络的隔离,我们看一下namespace是如何使用的 创建与配置 创建一个 ...
- 剑指offer之 调整奇数偶数数组位置
package Problem14; /* * 问题描述: * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位与数组的前半部分,所有偶数位与数组的 * 后半部分 */ publ ...
- Centos安装ntfs
ntfs优盘插在Linux上是无法直接使用的,需要安装ntfs插件才可使用 centos上安装ntfs-3g 下载ntfs-3g安装包,上传至需要安装的服务器并解压 cd 进入ntfs-3g目录,依次 ...