Hibernate中表的一对一关系

编程入门 行业动态 更新时间:2024-10-28 09:14:06

一对一关系

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) {
		thispany = 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/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/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/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/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()mit();
		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()mit();
		session.close(); // 游离状态
	}
}

     

更多推荐

Hibernate中表的一对一关系

本文发布于:2023-06-14 08:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1457963.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:中表   关系   Hibernate

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!