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

hibernate的一对多双关联

一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

 

hihernate一对多关联映射(双向Dept<----->Emp)

一对多双向关联映射:

* 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
       * 在多一端采用<many-to-one>
 
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
 

 

 

下面就以员工和部门为例:

这里的意思是既可以根据在查找部门时根据部门去找该部门下的所有员工,又能在检索员工时获取某个员工所属的部门。

需要员工实体中植入部门实体。同时也需要在部门实体植入员工集合。

 

1.准备JavaBean

Dept实体类

public class Dept {
private Integer deptid;
private String deptname;
//植入员工集合
private Set<Emp> emps=new HashSet<Emp>();

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 Set<Emp> getEmps() {
return emps;
}

public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}

Emp实体类
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.onetomany.entity">
<!--表名称-->
<class name="Dept" table="DEPT" schema="root">
<!--列名-->
<id name="deptid" column="DEPTID">
<!--主键生成的策略 native:自动生成主键字段-->
<generator class="native"></generator>
</id>
<property name="deptname" column="DEPTNAME"></property>
<!--植入set 标签 -->
<set name="emps">
<!--多的一方表的外键列-->
<key column="deptno"></key>
<one-to-many class="Emp"></one-to-many>
</set>
</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.onetomany.entity">
<!--表名称-->
<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/onetomany/entity/Dept.hbm.xml"></mapping>
<mapping resource="cn/day04mapping/onetomany/entity/Emp.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

4.书写测试类

// 一对多双向关联    hibernate工具类的运用
@Test
public void test03(){
Session session = HibernateUtil.getSession();
String hql="from Dept";
Query query = session.createQuery(hql);
List<Dept> list = query.list();
for (Dept item:list){
System.out.println(item.getDeptname());
System.out.println("==================");
for (cn.day04mapping.onetomany.entity.Emp emp:item.getEmps()){
System.out.println(emp.getEname());
}
}
System.out.println("===============================================根据员工编号查询部门");
cn.day04mapping.onetomany.entity.Emp emp=session.load(cn.day04mapping.onetomany.entity.Emp.class,1);
System.out.println(emp.getDept().getDeptname());
}



hibernate工具类
public class HibernateUtil {
static Configuration cfg;
static SessionFactory factory;
static ThreadLocal<Session> td;
//静态代码块
static {
cfg=new Configuration().configure();
factory=cfg.buildSessionFactory();
td=new ThreadLocal<Session>();
}
public static Session getSession(){
//看看有无线程变量
Session session = td.get();
if (session==null){
//线程中没有session对象 创建一个
session = factory.openSession();
td.set(session);
}
//没有和当前线程绑定
return session;
}

public static void closeSession(){
Session session = td.get();
td.set(null);
session.close();
}
}





 

 
 

 

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