Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)
hibernate.cfg.xml:
<hibernate-configuration>
<session-factory name="sessionFactory">
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="cn/hbm/Person.hbm.xml" />
<mapping resource="cn/hbm/IdCard.hbm.xml" />
</session-factory>
</hibernate-configuration>
Person:
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;
}
}
hbm.xml
<hibernate-mapping package="cn.model">
<class name="Person" table="PERSON">
<id name="id" column="ID">
<generator class="native"></generator>
</id>
<property name="name" column="NAME" type="java.lang.String" />
<one-to-one name="idCard" />
</class>
</hibernate-mapping>
IdCard:
public class IdCard {
private Integer id;
private Date usefullLife;
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getUsefullLife() {
return usefullLife;
}
public void setUsefullLife(Date usefullLife) {
this.usefullLife = usefullLife;
}
}
hbm.xml:
<hibernate-mapping package="cn.model">
<class name="IdCard" table="ID_CARD">
<id name="id" column="ID">
<!-- 对一主键关联映射的内容 foreign:表明当前表的主键的生成使用另外一个相关联的对象的标识符(依托于其他表的主键)
和 one-to-one联合一起使用 -->
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="usefullLife" column="USEFULL_LIFE"/>
<!-- constrained="true" 是否添加约束 -->
<one-to-one name="person" constrained="true" />
</class>
</hibernate-mapping>
创建表并添加数据
public void save(){
Session session=null;
Transaction tran=null;
try{
Person person=new Person();
person.setName("杰克");
IdCard idCard=new IdCard();
idCard.setUsefullLife(new Date());
idCard.setPerson(person);
person.setIdCard(idCard);
session=HibernateSessionFactory.getSession();
tran=session.beginTransaction();
session.save(person);
session.save(idCard);
tran.commit();
}catch(Exception e){
if(session!=null){
session.close();
}
}
}
执行后会看到,Person和IdCard的id是一样的,通过<generator class="foreign"> 外部关系的型式可以使idCard的id和person的id关联起来
再看一下创建的SQL:
他们关联的关系是使用了主外键约束进行关联;
查询的时候通过Person可以得到IdCard,通过IdCard也可以得到Person
public Person getPersonById(Integer id){
Session session=null;
try{
session=HibernateSessionFactory.getSession();
return (Person)session.get(Person.class, id);
}catch(Exception e){
if(session!=null){
session.close();
}
}
return null;
}
public IdCard getIdCardById(Integer id){
Session session=null;
try{
session=HibernateSessionFactory.getSession();
return (IdCard)session.get(IdCard.class, id);
}catch(Exception e){
if(session!=null){
session.close();
}
}
return null;
}
测试代码:
@Test
public void testGet(){ Demo demo=new Demo();
Person per=demo.getPersonById(1);
System.out.println("人员姓名:"+per.getName()+",身份证有效期:"+per.getIdCard().getUsefullLife());
}
@Test
public void testGet2(){
Demo demo=new Demo();
IdCard idCard=demo.getIdCardById(1);
System.out.println("身份证ID:"+idCard.getId()+",人员姓名 :"+idCard.getPerson().getName());
}
通过两个查询可以看出,通过IdCard获取 person的时候,实际上他们是查了两次!
对于这种一对一的映射关系,我们同样可以使用many-to-one的方式进行实现;
只需要在IdCard的映射关系中,使Person唯一即可:
只需要更改IdCard的映射文件即可:
<hibernate-mapping package="cn.model">
<class name="IdCard" table="ID_CARD">
<id name="id" column="ID">
<generator class="native" />
</id>
<property name="usefullLife" column="USEFULL_LIFE"/>
<many-to-one name="person" column="PERSON_ID" unique="true" not-null="true" />
</class>
</hibernate-mapping>
使用这种方式在创建表的时候,表之间关系和one-to-one是一样的:
但是表结构是不一样的,在IdCard表中多了一个外键的关联:
Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)的更多相关文章
- Hibernate One-to-One Mappings 一对一关系映射
Hibernate One-to-One Mappings 一对一关系映射 关键:一对一关系映射和多对一关系映射非常像.仅仅是unique 属性值为 true 样例:一个员工仅仅能有一个地址. Hib ...
- Hibernate学习笔记(五) — 多对多关系映射
多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...
- 问题记录:EntityFramework 一对一关系映射
EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...
- mybatis中一对一关系映射
一对一关系中普通的配置方式 一.多表连接查询语句: <select id="selectStudentWithAddress" parameterType="int ...
- JavaEE之Hibernate(开放源代码的对象关系映射框架)
Hibernate(开放源代码的对象关系映射框架) 1.简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- Hibernate学习笔记(四)关系映射之一对一关联映射
一. 一对一关联映射 ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 Ø 主键关联:即让 ...
- hibernate(五) hibernate一对一关系映射详解
序言 之前讲解了一对多(单向.双向).多对多(双向),今天就讲解一下最后一个关系,一对一. 心情不错.状态也挺好的,赶紧写一篇博文造福一下大家把. --WH 一.一对一关系的概述 一对一关系看起来简单 ...
- Hibernate一对一关系映射
Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
随机推荐
- 数据指令MOV
MOV分成三类,第一类不需要拓展(MOV),第二类做符号拓展(MOVS),第三类做零拓展(MOVZ),拓展类型根据源操作数决定. 这三类根据操作的数据类型其后可加l,w,b. MOV操作的操作数可以是 ...
- linux之SQL语句简明教程---SUBSTRING
SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分.这个函数的名称在不同的资料库中不完全一样: MySQL: SUBSTR( ), SUBSTRING( ) Oracle: S ...
- 线性表的Java实现
一.概念 对于常用的数据结构,可分为线性结构和非线性结构,线性结构主要是线性表,非线性结构主要是数和图.当n>0时,表可表示为:(a0,a1,a2,a3,…an) 1. 线性表的特征: 1.存在 ...
- 学用 ASP.Net 之 System.Math 类
本文来自:http://www.cnblogs.com/del/archive/2011/01/03/1924746.html 成员: /* 字段 */ Math.E; //2.7182 ...
- 专题开发十三:JEECG微云高速开发平台-附录
专题开发十三:JEECG微云高速开发平台-附录 12.1UI库经常使用控件參考演示样例 序号 控件 解决方式 參考演示样例 1 datagrid数据列表.字段採用数据字典显示文本 <t:dgCo ...
- ORACLE 表连接详解
在ORACLE中,表连接方式主要有:内连接,外连接,自连接: 内连接: 这是最常用的连接查询 SELECT * FROM A INNER JOIN B ON A.ID=B.ID SELECT * FR ...
- 启动监听报错:TNS-12537: TNS:connection closed TNS-12560: TNS:protocol adapter error TNS-00507: Connection closed Linux Error: 29: Illegal seek
启动监听程序报错: 说明:在rhel5.8上安装完成oracle11g数据库后,使用netca创建完监听,启动监听时报错.还未使用dbca创建实例. [oracle@rusky-oracle11g ~ ...
- ORACLE数据库存储结构简介(转)
首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内部的组织和管理数据的方式. 物理存储结构:o ...
- C#获取本周、上周、本月、上月、本季度、上季度、本年、上一年起始时间和结束时间
/// 取得某月的第一天 /// </summary> /// <param name="datetime">要取得月份第一天的时间</param&g ...
- 绝对好文C#调用C++DLL传递结构体数组的终极解决方案
C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文 http://blog.csdn.net/xxdddail/art ...