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)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
随机推荐
- 如何测试私有 Private/Internal 方法
在实际开发中,经常会遇到这样的情况. 一个共有的 Public 方法实现某一主要功能,但是由于该功能的实现非常复杂,需要很多的辅助类,辅助方法.由于代码封装性的需求,我们通常需要把这些辅助的类方法定义 ...
- COB Epoxy灌膠時氣泡產生的原因與解決方法
COB的黑膠 (Epoxy)有氣泡通常是不被允許的,因為外部氣孔不但會影響到外觀,內部氣孔更有可能會破壞 Wire bonding 的鋁線穩定度.既使在COB製程剛完成的時候沒有通過功能測試,也不代表 ...
- 在cocos2d-x界面中嵌入Android的WebView
在Cocos2dxActivity.java中, (1) 增加函数onCreateLayout, [java] view plain copy public LinearLayout onCre ...
- linux系统监控常用工具
linux系统监控常用工具 一.系统核心工具包(coreutils) 1./bin/df 报告系统的磁盘空间用量 df -h 显示磁盘分区fdisk -l 2./bin/uname 显示系统信息 u ...
- 演示如何通过 web api 上传文件MVC40
演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...
- 充分利用HTML标签元素 – 简单的xtyle前端框架
xtyle框架充分利用语义化标签来做美化样式,兼容多款主流浏览器,包括IE8. xtyle框架虽然没BS这么强大,但我觉得也很实用,体积不算很大,适用于企业网站.WordPress主题.个人网站.博客 ...
- JqueryUI-1
本文在于巩固基础 学习网址:http://jqueryui.com/ 基本概念:jQuery UI[是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画. ...
- HTML 基础 2
1. 认识CSS样式: CSS:层叠样式表(Cascading Style Sheets),主要用于定义HTML内容在浏览器内的显示样式 语法: 选择符{ 属性: 值} 举例: p{ color: b ...
- UVA 12219 Common Subexpression Elimination
题意: 求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号. 分析: 用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示. ...
- (七)Android中AIDL的应用与理解
一.跨应用启动Service Intent serviceIntent=new Intent();serviceIntent.setComponent(new ComponentName(" ...