hibernate进阶之路之多对一映射(三)

这篇博客详细探讨了Hibernate中的多对一映射,解释了映射原理及其实现方式。通过创建Group和User实体,配置映射文件,展示了在处理外键关联时可能出现的TransientObjectException异常及其解决方案,如设置级联保存更新。最终,通过示例展示成功实现多对一映射后的数据库状态。

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

        本篇博客将介绍hibernate多对一映射,多对一映射应该是使用最为频繁,也是最为常用的映射。映射原理是在多的一端加入一个外键,指向了一的一端。

        首先建立实体对象Group和User:

public class Group {

	private int id;
	
	private String name;

        //省略getter和setter
}
public class User {

	private int id;
	
	private String name;
	
	private Group group;

        //省略getter和setter
}
User持有Group的引用。


        建立实体相关的映射文件:

Group.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>
	<class name="com.tgb.hibernate.Group" table="t_group">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>
User.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>
	<class name="com.tgb.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="group" column="groupid"/>
	</class>
</hibernate-mapping>
只需要添加一个<many-to-one/>标签即可。

  

       创建测试(只写逻辑代码):

                        session.beginTransaction();
			
			Group group = new Group();
			group.setName("用户组1");
			
			User user1 = new User();
			user1.setName("张三");
			user1.setGroup(group);
			
			User user2 = new User();
			user2.setName("李四");
			user2.setGroup(group);
			
			session.save(user1);
			session.save(user2);
			
			session.getTransaction().commit();
结果console输出:



TransientObjectException异常抛出,再看上面的输出的sql语句,没有先往t_group表中插入一条记录,而且t_user有外键关联,Group实体对象没有处于被session管理的状态,所以报了这个异常,解决办法可以在执行save(user)之前把group持久化了,session.save(group); 也可以在User.hbm.xml中的many-to-one标签添加属性cascade="save-update",就是添加级联,参数表示save或者update的时候会先把级联对象持久化再执行当前的操作。


结果输出:


数据库:

t_group:


t_user:


这样就实现了hibernate多对一实体映射。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值