1.多对一的关联映射
使用员工和球队的例子
类图:
数据库关系图:
1.创建模型
创建多的一端Emp.java
public class Emp {
private Integer empNo;
private String ename;
private Date birthday;
private Integer gender;
private String address;
/*引入一的一端的类作为成员,指定多对一的关系*/
private Team team;
创建一的一端Team.java
public class Team {
private Integer tId;
private String tName;
private String loc;
2.配置映射文件
配置多的一端
com/zy/hiber/model/Emp.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zy.hiber.model">
<class name="Emp" table="t_emp">
<id name="empNo" column="emp_no">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<property name="birthday"></property>
<property name="gender"></property>
<property name="address"></property>
<!--
指定多对一的关系
name:多的一端(emp)的类中的一的类(team)的属性名
column:建表后多的一端(t_emp)中的外键
-->
<many-to-one name="Team" column="t_id"></many-to-one>
</class>
</hibernate-mapping>
一的一端
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zy.hiber.model">
<class name="Team" table="t_team">
<id name="tId" column="t_id">
<generator class="native"></generator>
</id>
<property name="tName" column="t_name"></property>
<property name="loc"></property>
</class>
</hibernate-mapping>
Hibernate的映射文件创建后要注册到我们的hibernate.cfg.xml中,然后导出数据库即可。
<!--显示执行的SQL语句-->
<property name="show_sql">true</property>
<mapping resource="com/zy/hiber/model/Emp.hbm.xml"/>
<mapping resource="com/zy/hiber/model/Team.hbm.xml"/>
.
3.测试多对一
1.保存
public class TestHibernate {
@Test
public void testAdd(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try {
//创建一支球队
Team t = new Team();
t.settName("gongniu");
t.setLoc("gggg");
//保存球队
session.save(t);
//创建员工
Emp emp = new Emp();
emp.setEname("a1");
emp.setGender(1);
emp.setBirthday(new Date());
emp.setAddress("aaaa");
Emp emp1 = new Emp();
emp1.setEname("a2");
emp1.setGender(1);
emp1.setBirthday(new Date());
emp1.setAddress("bbbb");
//设置员工和球队的关系
emp.setTeam(t);
emp1.setTeam(t);
//保存员工
session.save(emp);
session.save(emp1);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeResource(session);
}
}
}
注意:在保存多的一端的时候一定要先保存一的一端,如果一的一端是瞬时对象就会报错
正确输出
随后数据库会产生响应的数据。
这里我出现了一个问题,那就是中文保存到数据库是乱码的问题,我的问题应该是属于数据库的问题。
在这里请参考
转自:https://blog.csdn.net/heng_id/article/details/50425134
保存多对一的关系的时候也可以使用级联的方式
<property name="address"></property>
<!--
指定多对一的关系
name:多的一端(emp)的类中的一的类(team)的属性名
column:建表后多的一端(t_emp)中的外键
cascade:delete切记不要使用
save-update级联保存或更新
all包含了以上两种
none不使用级联(默认的)
-->
<many-to-one name="team" column="t_id" cascade="save-update"></many-to-one>
</class>
使用级联的保存就不需要单独保存一的一端了。就可以去掉session.save(t)。
2.查询
get() 和 load()都可以
@Test
public void testQuery(){
Session session = HibernateUtils.getSession();
try {
Emp emp = (Emp)session.get(Emp.class, 2);
System.out.println(emp);
System.out.println(emp.getTeam());
} catch (Exception e) {
e.printStackTrace();
}finally{
HibernateUtils.closeResource(session);
}
}