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)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
随机推荐
- Vue.js实现拼图游戏
Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...
- Genymotion如何访问本地服务器?
找到原因了,其实跟Genymotion没有关系,因为他本身是作为VirtualBox的一个虚拟OS在运行. 默认情况下,查看Genymotion的网络配置,是Host-Only模式: Microsof ...
- ZZ的计算器
Problem Description ZZ自从上大学以来,脑容量就是以SB计算的,这个吃货竟然连算术运算也不会了,可是当今的计算机可是非常强大的,作为ACMer, 几个简单的算术又算得了什么呢?可是 ...
- 使用LINQ查询非泛型类型
原文地址:http://www.cnblogs.com/buzz/archive/2009/04/23/1442159.html using System;using System.Collectio ...
- 方差var,标准差
wiki摘录如下(红色字体是特别标注的部分): 方差:http://zh.wikipedia.org/wiki/%E6%96%B9%E5%B7%AE 方差 变异量(数)(Variance),应用数学里 ...
- Debian安装JAVA环境(转载)
Debian官方没有维护专门的Java软件包,所以不能直接用apt-get工具来安装.在Debian系统中要安装Java,有两种方式,一种是用传统方式:一种是Debian方式. 1. 传统方式 在 s ...
- http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html
http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html
- 聚类算法初探(五)DBSCAN
最近由于工作需要,对聚类算法做了一些相关的调研.现将搜集到的资料和自己对算法的一些理解整理如下,供大家参考. 另外在算法代码方面,我也做了一些实现(包括串行和并行),欢迎感兴趣的朋友探讨和交流. 第一 ...
- asp.net页面与页面之间参数传递
传值asp文件send.aspx 代码如下 复制代码 <form id="form1" runat="server" action="recei ...
- HDU 5785 Interesting
题目: 大概说给一个字符串,找到其所有子串[i...k]满足它是由两个回文串拼成的,求Σi*k. 分析: 用val[1][i]表示以i结尾的回文串的起始位置的和val[0][i]表示以i起始的回文串的 ...