Hibernate 一对一双向关联关系

双向一对一关联关系:

例子: 一个人(Person)唯一拥有一张身份证,一张身份证(IDCard) 只能属于一个人

双向一对一 与 双向多对一 很类似,可以看出特殊的多对一,只不过多的一方加上一个约束 unique="true"

1)实体类

Person.java

package com.lcy.model;

public class Person {
	
	private int id;
	private String name;
	private IDCard idCard;
	public int getId() {
		return id;
	}
	public void setId(int 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;
	}
	public Person(String name) {
		this.name = name;
	}
	public Person() {
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + "]";
	}
}

IDCard.java

package com.lcy.model;

public class IDCard {
	
	private int id;
	private int number;
	private Person person;
	
	public IDCard() {
		
	}
	public IDCard(int number) {
		this.number = number;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	@Override
	public String toString() {
		return "IDCard [id=" + id + ", number=" + number + "]";
	}
}

2)关联关系

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="com.lcy.model">
	
	<class name="Person" table="t_person">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<many-to-one name="idCard" class="IDCard">
			<column name="idNumber" unique="true" />
		</many-to-one>
	</class>

</hibernate-mapping>

PS:需要在多的一方设置 unique="true"

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="com.lcy.model">
	
	<class name="IDCard" table="t_idcard">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="number" type="int"></property>
		<one-to-one name="person" class="Person" property-ref="idCard"></one-to-one>
	</class>
	
</hibernate-mapping>

PS:property-ref="idCard" 这个值是 Person 这个类中的 idCard属性

3)将映射描述文件 添加到 hibernate.cfg.xml 主配置文件中

	<mapping resource="com/lcy/model/IDCard.hbm.xml" />
	<mapping resource="com/lcy/model/Person.hbm.xml" />

4)编写测试

	@Test
	public void test(){
		Person person = new Person("王保保");
		IDCard idCard = new IDCard(3200103);
		person.setIdCard(idCard);
		idCard.setPerson(person);
		
		session.save(person);
		session.save(idCard);
	}

PS:如果先保存 多的一方,再保存一的方,执行的结果表明也会多出一条 update 语句

5)打印输出的 SQL 语句

---------创建表------------
Hibernate: create table t_idcard (id integer not null auto_increment, number integer, primary key (id)) engine=InnoDB
Hibernate: create table t_person (id integer not null auto_increment, name varchar(255), idNumber integer, primary key (id)) engine=InnoDB
---------修改表结构------------
Hibernate: alter table t_person drop index UK_59gh4xpj2j5vo3vql95fwid9o
Hibernate: alter table t_person add constraint UK_59gh4xpj2j5vo3vql95fwid9o unique (idNumber)
Hibernate: alter table t_person add constraint FK8igkb0on9l0vl7qiqlakwem93 foreign key (idNumber) references t_idcard (id)
---------执行插入存在------------
Hibernate: insert into t_person (name, idNumber) values (?, ?)
Hibernate: insert into t_idcard (number) values (?)
Hibernate: update t_person set name=?, idNumber=? where id=?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值