Hibernate 일대일 설정

19000 단어 many2oneone2many
hibenate 의 다 대 1 설정 은 두 가지 상황 이 있 습 니 다.
하 나 는 서브 시트 의 외 키 가 메 인 시트 에 대응 하 는 메 인 키 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();
			}
		}
	}

}

 

좋은 웹페이지 즐겨찾기