Hibernate(九)实现一对一关联映射关系
来源:互联网 发布:网络推广视频教程 编辑:程序博客网 时间:2024/06/06 03:45
Hibernate中实现一对一映射有基于外键的方式和基于主键的方式。由于基于主键方式的映射在实现删除等操作时存在的问题且不够灵活,一般建议使用基于外键的方式实现。
以个人与身份证的关系为例(主要看映射文件的配置和实体类):
基于外键的方式(只有有外键方可以维护关联关系):
package test.hibernate.hbmOneToOne;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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "[Person:id=" + id + ",name=" + name + "]";}}
package test.hibernate.hbmOneToOne;public class IDCard {private Integer id;private String IDNumber;private Person person;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getIDNumber() {return IDNumber;}public void setIDNumber(String iDNumber) {IDNumber = iDNumber;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "[IDCard:id="+id+",IDNumber="+IDNumber+"]";}}
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="test.hibernate.hbmOneToOne"><class name="Person" table="person"><id name="id" type="integer" column="id"><generator class="native" /></id><property name="name" /><one-to-one name="idCard" class="IDCard" property-ref="person"></one-to-one></class></hibernate-mapping>IDCard.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="test.hibernate.hbmOneToOne"><class name="IDCard" table="idCard"><id name="id" type="integer" column="id"><generator class="native" /></id><property name="IDNumber" /><many-to-one name="person" class="Person" column="personId" unique="true"></many-to-one></class></hibernate-mapping>
测试类
package test.hibernate.hbmOneToOne;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App {private static SessionFactory sessionFactory = new Configuration()//.configure()//.addClass(Person.class)// 添加Hibernate实体类(加载对应的映射文件).addClass(IDCard.class)//.buildSessionFactory();@Testpublic void testSave() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------// 构建对象Person person = new Person();person.setName("张三");IDCard idCard = new IDCard();idCard.setIDNumber("377489392002121X");// 关联起来person.setIdCard(idCard);idCard.setPerson(person);// 保存session.save(person);session.save(idCard);// --------------------------------------------session.getTransaction().commit();session.close();}@Testpublic void testGet() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// 获取数据Person person = (Person) session.get(Person.class, 2);System.out.println(person);System.out.println(person.getIdCard());IDCard idCard = (IDCard) session.get(IDCard.class, 2);System.out.println(idCard);System.out.println(idCard.getPerson());session.getTransaction().commit();session.close();}// 解除关联关系,从有外键方@Testpublic void testRemoveRelation() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------IDCard idCard = (IDCard) session.get(IDCard.class, 1);idCard.setPerson(null);// --------------------------------------------session.getTransaction().commit();session.close();}// 删除,只能做有外键方到无外键方的单向关联@Testpublic void testDelete() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------// Person person=(Person) session.get(Person.class, 2);// session.delete(person);//删除失败,有personId外键,抛出异常IDCard idCard = (IDCard) session.get(IDCard.class, 3);session.delete(idCard);// 卡删了,人还在// --------------------------------------------session.getTransaction().commit();session.close();}}
基于主键的方式(双方都不可以维护关联关系,映射文件配置有所不同):
Person.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="test.hibernate.hbmOneToOne2"><class name="Person" table="person2"><id name="id" type="integer" column="id"><generator class="native" /></id><property name="name" /><one-to-one name="idCard" class="IDCard"></one-to-one></class></hibernate-mapping>IDCard.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="test.hibernate.hbmOneToOne2"><class name="IDCard" table="idCard2"><id name="id" type="integer" column="id"><!-- 当使用基于主键的一对一映射时,有外键方的主键生成策略 一定要是foreign。 参数property:生成主键值时所根据的对象。 --><generator class="foreign"><param name="property">person</param></generator></id><property name="IDNumber" /><!-- constrained外键约束 --><one-to-one name="person" class="Person" constrained="true"></one-to-one></class></hibernate-mapping>
package test.hibernate.hbmOneToOne2;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App {private static SessionFactory sessionFactory = new Configuration()//.configure()//.addClass(Person.class)// 添加Hibernate实体类(加载对应的映射文件).addClass(IDCard.class)//.buildSessionFactory();@Testpublic void testSave() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------// 构建对象Person person = new Person();person.setName("张三");IDCard idCard = new IDCard();idCard.setIDNumber("377489392002121X");// 关联起来person.setIdCard(idCard);idCard.setPerson(person);// 保存//session.save(person);session.save(idCard);// --------------------------------------------session.getTransaction().commit();session.close();}// 解除关联关系@Testpublic void testRemoveRelation() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------//IDCard idCard = (IDCard) session.get(IDCard.class, 1);//idCard.setPerson(null);//抛异常Person person=(Person) session.get(Person.class, 3);person.setIdCard(null);//数据库中的数据没有改变// --------------------------------------------session.getTransaction().commit();session.close();}// 删除@Testpublic void testDelete() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------//IDCard idCard = (IDCard) session.get(IDCard.class, 2);//session.delete(idCard);//正常Person person=(Person) session.get(Person.class, 3);session.delete(person);//抛异常,id作为外键// --------------------------------------------session.getTransaction().commit();session.close();}}
1 0
- Hibernate(九)实现一对一关联映射关系
- Hibernate关联关系映射(一对一关联)
- Hibernate(九)hibernate一对一关系映射
- Hibernate 映射一对一关联关系
- 【Hibernate】--关联关系映射:一对一关联
- Hibernate关联关系映射之一对一
- Hibernate中的关联关系一对一映射
- Hibernate映射一对一的关联关系
- Hibernate关联关系映射之一对一关联关系
- Hibernate -- 映射实体关联关系(一对一关联关系)
- hibernate映射一对一关联(主键关联)
- 一对一关联关系映射
- 映射一对一关联关系
- hibernate实现一对一单向关联映射
- 【HIbernate框架学习】:Hibernate对象关系映射之一对一关联映射(一)
- 【HIbernate框架学习】:Hibernate对象关系映射之一对一关联映射(二)
- hibernate一对一关联映射--
- hibernate一对一关联映射
- Importing `*` in Python
- Summary Ranges
- iOS动画之漂亮的时钟
- iOS敏捷开发之道,常用的宏定义总结
- HADOOP之HDFS
- Hibernate(九)实现一对一关联映射关系
- 股票学习10
- 硬件路由转发原理浅析-清晨补充
- [BZOJ3399] [Usaco2009 Mar]Sand Castle城堡
- 那些神奇的"大师"是如何炼成的(科学、迷信、心理)
- iOS动画之模拟音量振动条
- BZOJ 1101 [POI2007]Zap 莫比乌斯反演
- Decorators and Functional Python
- HDU 2041