2014年1月13日 星期一

單向多對一 XML Mapping

如果今天兩個資料表考慮的情況是多對一,

例如員工跟部門,

多個員工屬於同一個部門,一個部門有許多員工,

如下圖:
















接著我們來看兩個物件的java檔案及配置,

Employee.java
package com.model;

public class Employee {
 private String empNo;
 private String name;
 private Dept dept;
 public String getEmpNo() {
  return empNo;
 }
 public void setEmpNo(String empNo) {
  this.empNo = empNo;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Dept getDept() {
  return dept;
 }
 public void setDept(Dept dept) {
  this.dept = dept;
 }
}

Dept.java
package com.model;

public class Dept {
 private String id; 
 private String name;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }

}

Employee.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="com.model.Employee" table="employee">
  <id name="empNo" type="java.lang.String">
   <generator class="assigned" />
  </id>
  <property name="name" type="string">
   <column name="name" length="10" not-null="true" />
  </property>
  <many-to-one name="dept" class="com.model.Dept" column="deptId"
 cascade="all" outer-join="true" />
 </class>
</hibernate-mapping>

這邊cascade一樣設定為all,

表示多的一方只要有save、update、delete都會連帶到一的一方,

outer-join為true表示在查詢時會直接join一方的table,

Dept.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="com.model.Dept" table="dept">
  <id name="id" type="java.lang.String">
   <generator class="assigned" />
  </id>
  <property name="name" type="string">
   <column name="name" length="20" not-null="true" />
  </property>
 </class>
</hibernate-mapping>

接下來我們撰寫測試程式,

TestEmployeeDept.java
package com.hibernate;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.util.HibernateUtils;
import com.model.Dept;
import com.model.Employee;

public class TestEmployeeDept {

 public static void main(String[] args) {

  Session session = HibernateUtils.getSessionFactory().openSession();
  Transaction tx = session.beginTransaction();
  try {
   
   Dept dept=new Dept();
   dept.setId("H2");
   dept.setName("人資服務部");
   
   Employee emp1=new Employee();
   emp1.setEmpNo("W1982");
   emp1.setName("Water");
   emp1.setDept(dept);
   
   Employee emp2=new Employee();
   emp2.setEmpNo("F2012");
   emp2.setName("Jeff");
   emp2.setDept(dept);
   
   Employee emp3=new Employee();
   emp3.setEmpNo("A1023");
   emp3.setName("Amber");
   emp3.setDept(dept);
   
   session.save(emp1);
   session.save(emp2);
   session.save(emp3);
   
   tx.commit();
  } catch (Exception e) {
   tx.rollback();
   e.printStackTrace();
  } finally {
   session.close();
   HibernateUtils.shutdown();
  }
 }

}

執行之後的console畫面
Hibernate: select dept_.id, dept_.name as name5_ from dept dept_ where dept_.id=?
Hibernate: insert into dept (name, id) values (?, ?)
Hibernate: insert into employee (name, deptId, empNo) values (?, ?, ?)
Hibernate: insert into employee (name, deptId, empNo) values (?, ?, ?)
Hibernate: insert into employee (name, deptId, empNo) values (?, ?, ?)


table employee















table dept

沒有留言:

張貼留言