本系列博客汇总在这里:Hibernate 汇总

多对一的关联映射

  • 多对一的关联映射
    • 1、创建模型
    • 2、配置映射文件
    • 3、测试多对一
      • 保存
      • 查询

 


源码工程文件为:hibernate4.3_04

多对一的关联映射

使用员工和球队的例子

类图:
Hibernate(9)_多对一的关联映射_级联
数据库关系图:
Hibernate(9)_多对一的关联映射_hibernate_02

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 中,然后导出数据库即可。
Hibernate(9)_多对一的关联映射_xml_03
Hibernate(9)_多对一的关联映射_级联_04
Hibernate(9)_多对一的关联映射_xml_05

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);
	}
}

注意:在保存多的一端的时候一定要先保存一的一端,如果一的一端是瞬时对象就会报错
Hibernate(9)_多对一的关联映射_hibernate_06
正确的输出
Hibernate(9)_多对一的关联映射_xml_07
Hibernate(9)_多对一的关联映射_级联_08
Hibernate(9)_多对一的关联映射_级联_09
保存多对一的关系的时候也可以使用级联的方式
Hibernate(9)_多对一的关联映射_映射文件_10
使用级联的保存就不需要单独保存一的一端了。
Hibernate(9)_多对一的关联映射_级联_11

查询

使用 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);
	}
}

Hibernate(9)_多对一的关联映射_映射文件_12
使用 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);
	}
}

Hibernate(9)_多对一的关联映射_xml_13

如有错误,欢迎指正!