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

本文介绍了一个使用Hibernate框架实现的Java程序案例,展示了如何通过主键关联建立User与Address类之间的一对一映射关系,并提供了具体的类定义及配置文件。

摘要生成于 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_pk" lazy="false">
		<id name="id" column="id" type="integer">
			<generator class="identity"></generator>
		</id>
		<property name="name" column="name" type="string" length="20"/>
		<one-to-one name="addr" class="com.xxc.domain.Address"/><!-- 设置User类一对一关联 -->
	</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_pk" lazy="false">
		<id name="id" column="id" type="integer" >
			<!-- 从外部属性中提取ID值,作为Address的ID值,这里提取的是Address类中User属性 -->
			<generator class="foreign">
				<param name="property">user</param>
			</generator>
		</id>
		<property name="province" column="province" type="string" length="20"/>
		<!-- constrained表示受到约束:1.不能为null  2.id必须有值 -->
		<one-to-one name="user" class="com.xxc.domain.User" constrained="true"/>
	</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);
		a.setUser(u);
		//先保存地址类,因为是用户存在外键,如果先保存用户,那么插入进去的用户数据的外键是null,等到地址数据插入的时候,还要进行一条update外键的操作。
		session.save(u);
		session.save(a);
		
		t.commit();
		session.close();
	}
	
	@Test
	public void load(){//测试,真否真的是一对一关系。再插入一条id为1的数据
		Session session = sf.openSession();
		Transaction t = session.beginTransaction();
		
		Address a = new Address();
		a.setProvince("BJ");
		
		User u = (User) session.load(User.class, 6);
		u.setAddr(a);
		a.setUser(u);
		
		session.save(a);
		
		t.commit();
		session.close();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值