Hibernate 일대일 설정
하 나 는 서브 시트 의 외 키 가 메 인 시트 에 대응 하 는 메 인 키 id 입 니 다.
다른 하 나 는 서브 시트 의 외 키 가 메 인 시트 에 대응 하 는 비 메 인 키 필드 로 보통 유일한 필드 입 니 다.(흔히 볼 수 있 는 장면 은 주문서 메 인 시트 와 주문서 제품 명세서 이다. 메 인 시트 와 서브 시트 는 모두 id 를 메 인 키 로 하지만 이들 은 orderno (주문서 번호) 를 통 해 연결된다)
다음은 이 두 가지 상황 에 따라 hibenate 맵 파일 의 설정 을 간단하게 소개 합 니 다.
첫 번 째 상황 은 주 표 가 부서 표 (depart. ment) 라 고 가정 하고 자 표 는 직원 표 (employee) 이다.
domain 클래스 는 다음 과 같 습 니 다.
package com.xigua.domain;
public class Department {
/**
* id
*/
private Long id;
/**
*
*/
private String departName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
}
package com.xigua.domain;
/**
*
* @author Administrator
*
*/
public class Employee {
/**
* id
*/
private Long id;
/**
*
*/
private String empName;
/**
*
*/
private Department department;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
대응 하 는 hibenate 맵 파일 은 다음 과 같 습 니 다:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xigua.domain">
<class name="Department">
<id name="id">
<generator class="native" />
</id>
<property name="departName" column="depart_name" />
<!-- ,
<set name="emps">
<key column="depart_id"></key>
<one-to-many class="Employee" />
</set>
-->
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xigua.domain">
<class name="Employee">
<id name="id">
<generator class="native"/>
</id>
<property name="empName" column="emp_name"/>
<!-- , name column , -->
<many-to-one name="department" column="depart_id"/>
</class>
</hibernate-mapping>
위 설정 을 통 해 엠 플 로 이 를 Department 와 1 대 1 로 연결 했다.
다음 코드 인증 을 두 드 릴 수 있 습 니 다:
package com.xigua.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.xigua.domain.Department;
import com.xigua.domain.Employee;
import com.xigua.utils.HibernateUtil;
public class Test1 {
public static void main(String args[]) {
save();
query();
}
public static void save() {
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Department depart = new Department();
depart.setDepartName("dev");
Employee emp1 = new Employee();
emp1.setEmpName("xigua1");
//
emp1.setDepartment(depart);
session.save(depart);
session.save(emp1);
tx.commit();
}catch(Exception e) {
if(tx != null) {
tx.rollback();
}
throw e;
}finally {
if(session != null) {
session.close();
}
}
}
public static void query() {
Session session = null;
try{
session = HibernateUtil.getSession();
Employee emp = (Employee) session.get(Employee.class, 1L);
System.out.println(emp.getEmpName());
//
Department depart = emp.getDepartment();
System.out.println(depart.getDepartName());
}catch(Exception e) {
throw e;
}finally {
if(session != null) {
session.close();
}
}
}
}
Department 대상 에 도 한 쌍 의 다 중 관 계 를 연결 하려 면 Department. 자바 류 와 대응 하 는 hibenate 맵 파일 을 수정 해 야 합 니 다.
Department. java 클래스 에 Set < Employe > 집합 대상 을 추가 하고, 대응 하 는 hibernate 파일 에 도 < Set > 탭 을 설정 합 니 다. 아래 코드 를 보십시오.
Set < Employe > 집합 대상 을 추가 한 Department. java 클래스:
package com.xigua.domain;
import java.util.Set;
public class Department {
/**
* id
*/
private Long id;
/**
*
*/
private String departName;
/**
* set
*/
public Set<Employee> emps;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
}
대응 하 는 hibenate 맵 파일 에 도 < Set > 탭 을 추가 합 니 다.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xigua.domain">
<class name="Department">
<id name="id">
<generator class="native" />
</id>
<property name="departName" column="depart_name" />
<!-- -->
<set name="emps">
<key column="depart_id"></key>
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
이상 부서 대상 에서 직원 대상 까지 의 다 중 관 계 를 설정 하 였 습 니 다.
다음 코드 를 두 드 려 서 검증 할 수 있 습 니 다:
package com.xigua.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.xigua.domain.Department;
import com.xigua.domain.Employee;
import com.xigua.utils.HibernateUtil;
public class Test2 {
public static void main(String args[]) {
save();
query();
}
public static void save() {
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Employee emp1 = new Employee();
emp1.setEmpName("xigua1");
Employee emp2 = new Employee();
emp2.setEmpName("xigua2");
Department depart = new Department();
depart.setDepartName("dev");
// employee
Set<Employee> emps = new HashSet<Employee>();
emps.add(emp1);
emps.add(emp2);
depart.setEmps(emps);
session.save(emp1);
session.save(emp2);
session.save(depart);
tx.commit();
}catch(Exception e) {
if(tx != null) {
tx.rollback();
}
throw e;
} finally {
if(session != null) {
session.close();
}
}
}
public static void query() {
Session session = null;
try{
session = HibernateUtil.getSession();
Department depart = (Department) session.get(Department.class, 1L);
System.out.println(depart.getDepartName());
//
Set<Employee> emps = depart.getEmps();
if(emps != null && emps.size() > 0) {
for(Employee emp : emps) {
System.out.println(emp.getEmpName());
}
}
} catch (Exception e) {
throw e;
} finally {
if(session != null) {
session.close();
}
}
}
}
아래 에서 말 하고 자 하 는 것 은 두 번 째 다 대 일 관계 이다. 즉, 글자 표 의 밖 은 메 인 표 의 메 인 키 id 가 아 닌 경우 이다. 여기 서 나 는 주문서 와 주문 제품 명세표 로 예 를 들 겠 다.
OrderMaster. java 대상 을 OrderDetail. java 대상 과 만 들 고 orderNo (주문 번호) 를 통 해 연결 합 니 다.
package com.xigua.domain;
import java.util.Set;
public class OrderMaster {
/**
* id
*/
private Long id;
/**
*
*/
private String orderNo;
/**
* ,
*/
private Set<OrderDetail> orderDetails;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public Set<OrderDetail> getOrderDetails() {
return orderDetails;
}
public void setOrderDetails(Set<OrderDetail> orderDetails) {
this.orderDetails = orderDetails;
}
}
package com.xigua.domain;
public class OrderDetail {
/**
* id
*/
private Long id;
// private String orderNo; // , OrderMaster
/**
*
*/
private String productCode;
/**
*
*/
private int productQty;
/**
* , ( )
*/
private OrderMaster orderMaster;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getProductCode() {
return productCode;
}
public void setProductCode(String productCode) {
this.productCode = productCode;
}
public int getProductQty() {
return productQty;
}
public void setProductQty(int productQty) {
this.productQty = productQty;
}
public OrderMaster getOrderMaster() {
return orderMaster;
}
public void setOrderMaster(OrderMaster orderMaster) {
this.orderMaster = orderMaster;
}
}
대응 하 는 맵 파일 은 다음 과 같 습 니 다:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.xigua.domain">
<class name="OrderMaster" table="order_master">
<id name="id">
<generator class="native"/>
</id>
<property name="orderNo" column="order_no"/>
<!-- -->
<set name="orderDetails">
<key column="order_no"></key>
<one-to-many class="OrderDetail"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.xigua.domain">
<class name="OrderDetail" table="order_detail">
<id name="id">
<generator class="native"/>
</id>
<!-- , orderNo , OrderDetail.java orderNo
<property name="orderNo" column="order_no"/>
-->
<property name="productCode" column="product_code"/>
<property name="productQty" column="product_qty"/>
<!-- , id, orderNo , property-ref="orderNo" orderNo OrderMaster orderNo property -->
<many-to-one name="orderMaster" column="order_no" property-ref="orderNo"/>
</class>
</hibernate-mapping>
테스트 클래스 코드 는 다음 과 같 습 니 다:
package com.xigua.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.xigua.domain.OrderDetail;
import com.xigua.domain.OrderMaster;
import com.xigua.utils.HibernateUtil;
public class Test3 {
public static void main(String args[]) {
save();
query();
}
public static void save() {
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
OrderMaster orderMaster = new OrderMaster();
orderMaster.setOrderNo("201408100000001");
OrderDetail orderDetail1 = new OrderDetail();
orderDetail1.setProductCode("18013-02");
orderDetail1.setProductQty(10);
// orderMaster
orderDetail1.setOrderMaster(orderMaster);
OrderDetail orderDetail2 = new OrderDetail();
orderDetail2.setProductCode("18018-01");
orderDetail2.setProductQty(5);
// orderMaster
orderDetail2.setOrderMaster(orderMaster);
session.save(orderDetail1);
session.save(orderDetail2);
session.save(orderMaster);
tx.commit();
}catch(Exception e) {
if(tx != null) {
tx.rollback();
}
throw e;
}finally {
if(session != null) {
session.close();
}
}
}
public static void query() {
Session session = null;
try{
session = HibernateUtil.getSession();
OrderDetail orderDetail = (OrderDetail) session.get(OrderDetail.class, 1L);
System.out.println(orderDetail.getProductCode() + "," + orderDetail.getProductQty());
// OrderMaster
OrderMaster orderMaster = orderDetail.getOrderMaster();
System.out.println(orderMaster.getOrderNo());
}catch(Exception e) {
throw e;
}finally {
if(session != null) {
session.close();
}
}
}
}
package com.xigua.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.xigua.domain.OrderDetail;
import com.xigua.domain.OrderMaster;
import com.xigua.utils.HibernateUtil;
public class Test4 {
public static void main(String args[]) {
save();
query();
}
public static void save() {
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
OrderDetail orderDetail1 = new OrderDetail();
orderDetail1.setProductCode("18013-02");
orderDetail1.setProductQty(23);
OrderDetail orderDetail2 = new OrderDetail();
orderDetail2.setProductCode("18013-02");
orderDetail2.setProductQty(23);
Set<OrderDetail> orderDetails = new HashSet<OrderDetail>();
orderDetails.add(orderDetail1);
orderDetails.add(orderDetail2);
OrderMaster orderMaster = new OrderMaster();
orderMaster.setOrderNo("201408100000001");
// OrderDetail
orderMaster.setOrderDetails(orderDetails);
session.save(orderDetail1);
session.save(orderDetail2);
session.save(orderMaster);
tx.commit();
} catch (Exception e) {
if(tx != null) {
tx.rollback();
}
throw e;
} finally {
if(session != null) {
session.close();
}
}
}
public static void query() {
Session session = null;
try{
session = HibernateUtil.getSession();
OrderMaster orderMaster = (OrderMaster) session.get(OrderMaster.class, 1L);
System.out.println(orderMaster.getOrderNo());
// OrderDetail
Set<OrderDetail> orderDetails = orderMaster.getOrderDetails();
if(orderDetails != null && orderDetails.size() > 0) {
for(OrderDetail orderDetail : orderDetails) {
System.out.println(orderDetail.getProductCode() + "," + orderDetail.getProductQty());
// , getOrderMaster() orderDetail.getOrderMaster() null
System.out.println(orderDetail.getOrderMaster());
}
}
}catch(Exception e) {
throw e;
}finally {
if(session != null) {
session.close();
}
}
}
}