Hibernate多对一关联
关联映射的本质
* 是将关联关系映射到数据库中,关联关系在对象模型中体现为内存中的一个或多个引用
<many-to-one>标签会在“多”的一端添加一个外键,指向“一”的一端,这个外键是由<many-to-one>
标签中的column属性定义的,如果忽略column属性,默认创建的外键与属性名相同
本人创建了一个User类,其中User有一个Group属性,User和Group就是Many to One 的关系
1.先上一张项目的完整包图,让大家都有个大致了解:

2.同时上我的User.java以及Group.java(id的类型都采用int,主键生成策略采用native,对应MySQL就是auto_increment):
package com.codedestiny.hibernate;

public class User ...{
private int id;
private String name;
private Group group;

public int getId() ...{
return id;
}
public void setId(int id) ...{
this.id = id;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
public Group getGroup() ...{
return group;
}
public void setGroup(Group group) ...{
this.group = group;
}
}
package com.codedestiny.hibernate;

public class Group ...{
private int id;
private String name;

public int getId() ...{
return id;
}
public void setId(int id) ...{
this.id = id;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
}
3.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.codedestiny.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
4.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.codedestiny.hibernate.User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="group" column="relatedGroup"></many-to-one>
<!--
<many-to-one name="group" column="relatedGroup" cascade="all"></many-to-one>
通过级联,可以不需要再session.save(group),但一般开发中不经常这样使用
-->
</class>
</hibernate-mapping>
5.JUnit测试类:Many2OneTest.java:(在没有设置级联时,一定要记住session.save(group))
package com.codedestiny.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;

public class Many2OneTest extends TestCase ...{

public void testMany2One() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
Group group = new Group();
group.setName("Xihua Univercity");
//将group转换为持久对象,若在这里不保存group,后面session.save(u)将会抛出一个TransientObjectException,
//因为持久化对象不能直接引用瞬时对象
session.save(group);

for(int i=0; i<10; i++) ...{
User u = new User();
u.setName("student" + i);
//建立对象之间的关系
u.setGroup(group);
session.save(u);
}
session.getTransaction().commit();
} catch (Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
} finally ...{
HibernateUtils.closeSession(session);
}
}

public void testLoaduser() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
User u = (User)session.load(User.class, 11);
System.out.println("User Name : " + u.getName());
System.out.println("relatedGroup : " + u.getGroup().getName());
session.getTransaction().commit();
} catch (Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
} finally ...{
HibernateUtils.closeSession(session);
}
}
}
本文介绍Hibernate框架中多对一关联映射的具体实现方式,包括如何在User类和Group类之间建立关联关系,并通过配置文件指定外键名称。此外,还提供了完整的JUnit测试示例,展示了如何保存具有多对一关联的对象。
3366

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



