Hibernate基于外键一对一映射操作实例

这篇博客通过公民和身份证的一对一关系为例,详细介绍了如何在Hibernate中设置和操作基于外键的一对一映射。文章包含了实体类Person和IdCard的定义,以及对应的映射文件内容,并提供了测试类APP的示例代码。
摘要由CSDN通过智能技术生成

背景:

公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证。


场景准备:

实体类:Person.java、IdCard.java


实体类以及映射文件代码:

Person.java

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;
	}
	
}


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_oneToOne">

	<!-- User表对应的映射关系 -->
	<class name="Person" table="person">
		<id name="id">
			<generator class="native" />
		</id>
		<property column="name" name="name" type="string" />
		
		<!-- 
			IdCard属性:IdCard类型
			表达的是本类与IdCard的一对一关系
			采用基于外键的一对一映射的方式
		-->
		<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true" cascade="all">
		
		</many-to-one>
		
				
	</class>
</hibernate-mapping>



IdCard.java

package h_hbm_oneToOne;

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_oneToOne">

	<!-- 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" property-ref="idCard">
		</one-to-one>
				
	</class>
</hibernate-mapping>


测试类:APP.java

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();
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值