本系列博客汇总在这里:Hibernate 汇总
多对一的关联映射
- 多对一的关联映射
-
- 1、创建模型
- 2、配置映射文件
- 3、测试多对一
-
- 保存
- 查询
多对一的关联映射源码工程文件为:hibernate4.3_04
使用员工和球队的例子
类图:
数据库关系图:
1、创建模型
创建多的一端
package com.wyx.hiber.model;
import java.util.Date;
public class Emp
{
private Integer empNo;
private String ename;
private Date birthday;
private Integer gender;
private String address;
/**
* 引入一的一端的类作为成员,指定多对一的关系
*
*/
private Team team;
public Team getTeam()
{
return team;
}
public void setTeam(Team team)
{
this.team = team;
}
public Integer getEmpNo()
{
return empNo;
}
public void setEmpNo(Integer empNo)
{
this.empNo = empNo;
}
public String getEname()
{
return ename;
}
public void setEname(String ename)
{
this.ename = ename;
}
public Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
public Integer getGender()
{
return gender;
}
public void setGender(Integer gender)
{
this.gender = gender;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
@Override
public String toString()
{
return "Emp [empNo=" + empNo + ", ename=" + ename + ", birthday="
+ birthday + ", gender=" + gender + ", address=" + address
+ "]";
}
}
创建一的一端
package com.wyx.hiber.model;
public class Team
{
private Integer tId;
private String tName;
private String loc;
public Integer gettId()
{
return tId;
}
public void settId(Integer tId)
{
this.tId = tId;
}
public String gettName()
{
return tName;
}
public void settName(String tName)
{
this.tName = tName;
}
public String getLoc()
{
return loc;
}
public void setLoc(String loc)
{
this.loc = loc;
}
@Override
public String toString()
{
return "Team [tId=" + tId + ", tName=" + tName + ", loc=" + loc + "]";
}
}
2、配置映射文件
配置多的一端
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wyx.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)中的外键
cascade:delete切记不要使用
save-update级联保存或更新
all包含了以上两种
none不使用级联(默认的)
-->
<many-to-one name="team" column="t_id" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
配置一的一端
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wyx.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 中,然后导出数据库即可。
3、测试多对一
保存
public void testAdd()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try
{
// 创建一支球队
Team t = new Team();
t.settName("公牛");
t.setLoc("芝加哥");
// 保存球队
session.save(t);
// 创建员工
Emp emp = new Emp();
emp.setEname("乔丹");
emp.setGender(1);
emp.setBirthday(new Date());
emp.setAddress("芝加哥");
Emp emp1 = new Emp();
emp1.setEname("菲尔");
emp1.setGender(1);
emp1.setBirthday(new Date());
emp1.setAddress("芝加哥");
// 设置员工和球队的关系
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);
}
}
注意:在保存多的一端的时候一定要先保存一的一端,如果一的一端是瞬时对象就会报错
正确的输出
保存多对一的关系的时候也可以使用级联的方式
使用级联的保存就不需要单独保存一的一端了。
查询
使用 get 来查询
@Test
public void testQuery()
{
Session session = HibernateUtils.getSession();
try
{
// 调用get方法来查询指定要查询的类和id
Emp emp = (Emp) session.get(Emp.class, 5);
System.out.println(emp);
System.out.println(emp.getTeam());
} catch (Exception e)
{
e.printStackTrace();
} finally
{
HibernateUtils.closeResource(session);
}
}
使用 load 来查询
@Test
public void testQuery1()
{
Session session = HibernateUtils.getSession();
try
{
// 调用load方法来查询指定要查询的类和id
Emp emp = (Emp) session.load(Emp.class, 5);
System.out.println(emp);
System.out.println(emp.getTeam());
} catch (Exception e)
{
e.printStackTrace();
} finally
{
HibernateUtils.closeResource(session);
}
}
如有错误,欢迎指正!