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();
	
	@Test
	public 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();
	}
	
	
	@Test
	public 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();
	}
	
	
	// 解除关联关系
	@Test
	public 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();
	}
	
	
	// 删除对对方的影响
	@Test
	public 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();
	}
}














  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值