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

被折叠的 条评论
为什么被折叠?



