Hibernate中表的一对一关系

本文介绍了一对一关系在Hibernate中的两种映射方式:使用外键和主键同步,并提供了具体的Java代码实现及XML配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对一关系

l  情况1:主表的主键,与从表的外键(唯一),形成主外键关系

l  情况2:主表的主键,与从表的主键,形成主外键关系(从表的主键又是外键)

 

情况一:使用外键

 
 
case:
Company:
package com.hcx.domain;

public class Company {
	private Integer id;
	private String name;
	private Address address;
	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 Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "Company [id=" + id + ", name=" + name + ", address=" + address
				+ "]";
	}
	
	
}

 
 
Address:
package com.hcx.domain;

public class Address {
	private Integer id;
	private String name;
	private Company company;
	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 Company getCompany() {
		return company;
	}
	public void setCompany(Company company) {
		this.company = company;
	}
	@Override
	public String toString() {
		return "Address [id=" + id + ", name=" + name + "]";
	}
	
	
}

 
 
Company.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="com.hcx.domain" >
 	<class name="Company" table="t_Company"   >
		<id name="id" column="id"    >
			<generator class="native"></generator>
		</id> 
			
		<property name="name" column="name" type="string" ></property>
		<!-- 配置一对一
		one-to-one : 默认使用主键同步策略完成一对一的表关系体现.
		property-ref : 指定company在一对一关联时 ,指向哪个属性.
		 -->
		<one-to-one name="address" class="Address" property-ref="company" > </one-to-one>
 	</class>
 </hibernate-mapping>

 
 
Address.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="com.hcx.domain" >
 	<class name="Address" table="t_Address"   >
		<id name="id" column="id"    >
			<generator class="native"></generator>
		</id> 
			
		<property name="name" column="name" type="string" ></property>
 		<!-- 
 		unique : 唯一,外键唯一.
 		 -->
 		<many-to-one name="company" class="Company" column="cid" unique="true" ></many-to-one>
 	</class>
 </hibernate-mapping>

 

情况二:主键同步

 
 
case:
Company.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="com.hcx.domain" >
 	<class name="Company" table="t_Company"   >
		<id name="id" column="id"    >
			<generator class="native"></generator>
		</id> 
			
		<property name="name" column="name" type="string" ></property>
		<!-- 配置一对一
		one-to-one : 默认使用主键同步策略完成一对一的表关系体现.
		cascade:
		fetch:
		lazy:
		 -->
		<one-to-one name="address" class="Address"  > </one-to-one>
 	</class>
 </hibernate-mapping>

 
 
Address.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="com.hcx.domain" >
 	<class name="Address" table="t_Address"   >
		<id name="id" column="id"    >
		<!-- foreign: 该主键既是主键又是外键 -->
			<generator class="foreign">
			<!-- 作为外键时引用哪个属性 -->
				<param name="property">company</param>
			</generator>
		</id> 
			
		<property name="name" column="name" type="string" ></property>
		<!-- 配置一对一关系 -->
		<one-to-one name="company" class="Company" constrained="true"  ></one-to-one>
 	</class>
 </hibernate-mapping>

 
 
Demo:
package com.hcx.b_secondcache;

import org.hibernate.Session;
import org.junit.Test;

import com.hcx.domain.Address;
import com.hcx.domain.Company;
import com.hcx.utils.HibernateUtils;
//一对一的操作
public class Demo {
	@Test
	//保存一对一数据
	//注意: 在一对一使用外键时, 外键所在的对象才能维护关系. 另一方无法维护关系
	public void fun1(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		Company company = new Company();
		company.setName("传智播客");
		
		Address addr = new Address();
		addr.setName("金燕龙");
		
		
		addr.setCompany(company);
		
		session.save(company);
		session.save(addr);
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	
	@Test
	//查询一对一数据
	//Hibernate查询一对一: 会使用表关联查询
	public void fun2(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		Company company = (Company) session.get(Company.class, 1);
		
		System.out.println(company);
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
}

 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值