Hibernate基于主键一对一映射操作实例
背景:
公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证。
这个是基于主键的,基于外键的映射在:http://blog.csdn.net/nthack5730/article/details/45336457
场景准备:
实体类:Person.java、IdCard.java
Person.java
package h_hbm_oneToOne2;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;}}
IdCard.java
package h_hbm_oneToOne2;public class IdCard {private Integer id;private String number;private Person person;//不要初始化,初始化会使对象处于临时状态,会使保存的时候抛异常,关联的人的对象public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}}
IdCard.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="h_hbm_oneToOne2"><!-- User表对应的映射关系 --><class name="IdCard" table="idCard"><id name="id"><generator class="native" /></id><property column="number" name="number" type="string" /><!-- person属性:Person类型表达的是本类与IdCard的一对一关系采用基于主键的一对一映射的方式本方无外键方property-ref:写的是对方映射中外键列对应的属性名,也就是Person类下的idCard属性名--><one-to-one name="person" class="Person"/></class>
</hibernate-mapping>
Person.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="h_hbm_oneToOne2"><!-- User表对应的映射关系 --><class name="Person" table="person"><id name="id"><!-- 当使用基于主键的一对一映射时,有外键方的主键生成策略一定要是foreign 参数property:生成主键值时所根据的对象【一对一时关联的对方】--><generator class="foreign"><param name="property">idCard</param></generator></id><property column="name" name="name" type="string" /><!-- IdCard属性:IdCard类型表达的是本类与IdCard的一对一关系采用基于主键的一对一映射的方式本方有外键--><one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one></class>
</hibernate-mapping>
测试代码:
App.java
package h_hbm_oneToOne2;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;import cn.marer.model.HibernateUtils;public class APP {private static SessionFactory sessionfactory = HibernateUtils.getSessionFactory();@Testpublic void testSave(){Session session = sessionfactory.openSession();//开启事务session.beginTransaction();//构建对象Person person = new Person();person.setName("张三");IdCard id = new IdCard();id.setNumber("123456");person.setIdCard(id);// session.save(id);session.save(person);//提交事务session.getTransaction().commit();session.close();}@Testpublic void testGet(){Session session = sessionfactory.openSession();//开启事务session.beginTransaction();//获取一方
// Person person= (Person) session.get(Person.class, 1);
// System.out.println(person.getName()+"---->" + person.getIdCard());IdCard id = (IdCard) session.get(IdCard.class, 1);System.out.println(id.getNumber() + "---->" + id.getPerson().getName());//提交事务session.getTransaction().commit();session.close();}// 解除关联关系@Testpublic void testRemoveRelation(){Session session = sessionfactory.openSession();// 开启事务session.beginTransaction();// 从无外键方解除关联关系不可以IdCard id = (IdCard) session.get(IdCard.class, 1);id.setPerson(null);// 基于主键的一对一映射,从有外键方解除关联关系,不可以。因为主键不能为空。
// Person person = (Person) session.get(Person.class, 1);
// person.setIdCard(null);//提交事务session.getTransaction().commit();session.close();}// 删除对对方的影响@Testpublic void testDelte(){Session session = sessionfactory.openSession();// 开启事务session.beginTransaction();// 会报异常
// IdCard id = (IdCard) session.get(IdCard.class, 1);
// session.delete(id);// 如果没有关联的对方,能删除// 如果有关联的对方:因为会直接执行删除自己,所以无外键方会有异常,有外键方没有异常。Person person = (Person) session.get(Person.class, 1);session.delete(person);// 有外键方能维护关联关系,从无外键方不能维护关联关系//提交事务session.getTransaction().commit();session.close();}
}
Hibernate基于主键一对一映射操作实例相关推荐
- Hibernate_9_Person和IdCard实例_一对一关系:基于主键
1)建立Person类:(与8同样) 2)建立IdCard类:(与8同样) 3)建立持久化类: 1>保存方法(与8同样) 2>获取方法(与8同样) 3>删除方法(与8同样) ...
- hibernate一对一主键关联映射(一)---单向关联
1.新建工程项目hibernate_one2one_pk_1,添加hibernate所需Jar包和mysql驱动Jar包. 2.建立工具类HihernateUtils.java和ExportDB.ja ...
- Hibernate(六)一对一映射关系
One to One 映射关系(只有当映射自定义对象时,才会用,hibernate支持的java类型都可直接设成属性,了解第一和第二种的xml即可) 基于外键的单向一对一 (xml和annotatio ...
- Hibernate 之主键生成策略
目录 前言 示例 准备 数据库建表 实体类定义和对应的xml配置 DemoDao 程序员自己控制:assigned 数据库控制 identity(标识列/自动增长) sequence:内部序列 Hib ...
- Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate各种主键生成策略与配置详解
为什么80%的码农都做不了架构师?>>> 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibern ...
- hibernate 各种主键生成策略(转)
http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...
- hibernate中主键的生成策略
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- oracle hibernate 主键,hibernate oracle 主键 自增
Hibernate 实现对oracle 数据库表ID的自动增长 1:建表 Create table test_table ( id integer ...
最新文章
- GitHub 13.1k | 所有的编程知识,都在这100 张思维导图里了
- boost::test模块测试从数据集对主测试套件的访问
- 算法工程师和python_算法工程师只掌握Python行吗?如果在java和cpp中选一门语言学习哪个更有用?...
- 6818 开发板 配置 ubuntu 桌面环境 与 ROS
- 算法题:(1) 有一个集合R = [a, b, c, d, e, f, g, h, i, j, k, l, m, n, ],....请写出求解这样的一个子集的通用算法。
- MFC CListCtrl实现双击编辑
- 【SQLMap工具-1】SQLMap简介及简单应用实例
- java速成(11/30)抽象类 abstract
- MATLAB简单解决输出某个数(组)内自然数的阶乘和问题
- Java单例模式——线程安全的懒汉模式
- css内联样式---动态绑定背景图片
- ubuntu下qt模拟键盘按键按下_Qt 项目之虚拟键盘
- 【Scratch考级99图】图26-等级考试scratch绘制复杂图形旋转三角形 少儿编程 scratch画图案例教程
- 更快更安全,HTTPS 优化总结
- 【单片机开发】stm32f429在线IAP 实现SD卡烧写程序
- 华为、微软、瑞幸、维达、奈飞、爱彼迎等公司高管变动
- Android 本地路径问题
- 如何找到局域网中的另外一个电脑
- 人民银行简历计算机水平,人民银行招聘,填写简历有哪些技巧?
- everpano 3D立体漫游软件