Hibernate关联关系之一对一(外键关联)

本文详细介绍了如何使用 Hibernate 实现 User 类和 Address 类的一对一关联关系,通过配置文件和测试类展示了如何在 Java 中操作数据库。

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

测试用户类和地址类的一对一关联关系:


User类:

package com.xxc.domain;

public class User {
	private Integer id;
	private String name;
	private Address addr;

	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 getAddr() {
		return addr;
	}

	public void setAddr(Address addr) {
		this.addr = addr;
	}
}

User.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.xxc.domain.User" table="users" lazy="false">
		<id name="id" column="id" type="integer">
			<generator class="identity"></generator>
		</id>
		<property name="name" column="name" type="string" length="20"/>
		<!-- 在外键关联的一方,用多对一模拟一对一,这样的话还不是一对一,这时候要加 unique="true" 表示在多的一方的外键是不能重复的-->
		<many-to-one name="addr" class="com.xxc.domain.Address" column="addr" unique="true"/>
	</class>
</hibernate-mapping>


Address类:

package com.xxc.domain;

public class Address {
	private Integer id;
	private String province;
	private User user;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getProvince() {
		return province;
	}

	public void setProvince(String province) {
		this.province = province;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

}


Address.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.xxc.domain.Address" table="address" lazy="false">
		<id name="id" column="id" type="integer" >
			<generator class="identity"></generator>
		</id>
		<property name="province" column="province" type="string" length="20"/>
		<!-- 属性参考:参考对端的映射addr属性的关联关系的方式 -->
		<one-to-one name="user" property-ref="addr"/>
	</class>
</hibernate-mapping>



测试类:

package com.xxc.app;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.BeforeClass;
import org.junit.Test;

import com.xxc.domain.Address;
import com.xxc.domain.User;

public class App {
	private static SessionFactory sf = null;
	
	@BeforeClass
	public static void initialize(){
		Configuration config = new Configuration();
		/*  也可以写成这样的形式
		 *	sf = config.addClass(Customer.class).addClass(Order.class).buildSessionFactory();
		 */
		
		config.addClass(User.class);
		config.addClass(Address.class);
		sf = config.buildSessionFactory();
		
	}
	
	@Test
	public void insertCustomer(){
		Session session = sf.openSession();
		Transaction t = session.beginTransaction();
		
		User u = new User();
		u.setName("HZ-XXC");
		
		Address a = new Address();
		a.setProvince("ZJ");
		
		u.setAddr(a);
		u.setAddr(a);
		//先保存地址类,因为是用户存在外键,如果先保存用户,那么插入进去的用户数据的外键是null,等到地址数据插入的时候,还要进行一条update外键的操作。
		session.save(a);
		session.save(u);
		
		t.commit();
		session.close();
	}
	
	@Test
	public void load(){//测试,真否真的是一对一关系。再插入一条id为1的数据
		Session session = sf.openSession();
		Transaction t = session.beginTransaction();
		
		User u = new User();
		u.setName("HKTK");
		
		Address a = (Address) session.load(Address.class, 1);//查询id为1的地址类,并将这个类设置到新创建的User类中
		u.setAddr(a);
		session.save(u);//会出异常,说Duplicate entry '1' for key 'addr'
		
		t.commit();
		session.close();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值