hibernate的映射之一(多对一单向关联)

hibernate的多对一映射

多对一应用相当的广泛:

例如:

从订单的角度来说多个订单可以对应一个消费者

从收货的地址来说多个收货地址可以对应一个收货人等。

 

下面就以员工和部门为例子。多个员工可以隶属于同一个部门。

Emp中定义一个Dept属性,而在Dept类中无须定义存放Emp对象的集合属性。

 

1.准备JavaBean

  部门实体类

public class Dept {
private Integer deptid; //部门编号
private String deptname; //部门名称

public Integer getDeptid() {
return deptid;
}

public void setDeptid(Integer deptid) {
this.deptid = deptid;
}

public String getDeptname() {
return deptname;
}

public void setDeptname(String deptname) {
this.deptname = deptname;
}
}



员工实体类:员工实体中需要植入一个部门实体。 原因:多个员工可以隶属于同一个部门。
public class Emp {
private Integer empno; //员工编号
private String ename; //员工名称
//植入一个部门实体
private Dept dept=new Dept();

public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}

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


2.准备持久化类的映射文件

部门一方

准备Dept.hbm.xml文件

<?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="cn.day04mapping.manytoone.entity">
<!--表名称 schema:操作数据库的用户名-->
<class name="Dept" table="DEPT" schema="root">
<!--列名-->
<id name="deptid" column="DEPTID">
<!--主键生成的策略 native:自动生成主键字段-->
<generator class="native"></generator>
</id>
<property name="deptname" column="DEPTNAME"></property>
</class>
</hibernate-mapping>

员工一方

准备Emp.hbm.xml文件
<?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="cn.day04mapping.manytoone.entity">
<!--name:表名称 schema 操作数据库的用户名-->
<class name="Emp" table="EMP" schema="root">
<!--列名-->
<id name="empno" column="EMPNO">
<!--主键生成的策略 native:自动生成主键字段-->
<generator class="native"></generator>
</id>
<property name="ename" column="ENAME"></property>
<!--多对一 单向关联
员工是多的一方
name:Emp中植入一方的属性名称
column;数据库中外键列的值
class:植入一方的属性的类型
-->
<many-to-one name="dept" column="deptno" class="Dept"></many-to-one>
</class>
</hibernate-mapping>



3.准备hibernate.cfg.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 指定数据库所用到的驱动 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- 指定数据库链接的url,hibernate链接的数据库名 -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的用户口令 -->
<property name="connection.password">root</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>

<!--格式化sql -->
<property name="format_sql ">true</property>
<!-- 打印sql 控制台-->
<property name="show_sql">true</property>
<!-- 指定数据库方言 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- 根据需要自动创建数据库表 -->
<property name="hbm2ddl.auto">update</property>

<!--关联小配置文件-->
<!--多对一-->
<mapping resource="cn/day04mapping/manytoone/entity/Dept.hbm.xml"></mapping>
<mapping resource="cn/day04mapping/manytoone/entity/Emp.hbm.xml"></mapping>

</session-factory>
</hibernate-configuration>


4.书写测试类

根据员工的编号查询该员工对应的部门。

//多对一单向关联
@Test
public void test01(){
//读取大配置文件
Configuration cfg=new Configuration().configure();
//session工厂
SessionFactory factory=cfg.buildSessionFactory();
//session对象
Session session = factory.openSession();
//提供一个员工编号
Emp emp = session.get(Emp.class, 1);
System.out.println(emp.getEname());
//隶属的部门
System.out.println(emp.getDept().getDeptname());
}



 

 

 

 

posted @ 2017-12-28 17:11  努力奋斗吧  阅读(210)  评论(0编辑  收藏  举报