2014-06-13 4 views
0

예를 들어 id = 1 인 EMPLOYEE를 업데이트 할 때이 employee_id의 CERTIFICATE 테이블에있는 이전 레코드를 모두 삭제하고 새 레코드를 삽입하는 가장 좋은 방법은 무엇입니까? 예를 들어, employee id = 1에는 A, B 인증서가 있습니다. 직원을 업데이트 할 때이 직원에 대한 모든 인증서를 삭제하고 인증서도 A, B 또는 새 C, D로 다시 삽입합니다.이전 레코드를 모두 삭제하고 새 레코드를 삽입하십시오.

create table EMPLOYEE (
    id INT NOT NULL auto_increment, 
    first_name VARCHAR(20) default NULL, 
    last_name VARCHAR(20) default NULL, 
    salary  INT default NULL, 
    PRIMARY KEY (id) 
); 

create table CERTIFICATE (
    id INT NOT NULL auto_increment, 
    certificate_name VARCHAR(30) default NULL, 
    employee_id INT default NULL, 
    PRIMARY KEY (id) 
); 

Hibernate 매핑

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
    <class name="Employee" table="EMPLOYEE"> 
     <id name="id" type="int" column="id"> 
     <generator class="sequence"> 
      <param name="sequence">employee_seq</param> 
     </generator> 
     </id> 
     <set name="certificates" lazy="false" cascade="all"> 
     <key column="employee_id" not-null="true"/> 
     <one-to-many class="Certificate"/> 
     </set> 
     <property name="firstName" column="first_name"/> 
     <property name="lastName" column="last_name"/> 
     <property name="salary" column="salary"/> 
    </class> 

    <class name="Certificate" table="CERTIFICATE"> 
     <id name="id" type="int" column="id"> 
     <param name="sequence">certificate_seq</param> 
     </id> 
     <property name="employee_id" column="employee_id" insert="false" update="false"/> 
     <property name="name" column="certificate_name"/> 
    </class> 

</hibernate-mapping> 
+0

직원에게 업데이트를 보낼 때 인증서에서 행을 삭제하는 트리거를 만듭니다. –

답변

1

당신은 자동으로 관련 기록을 삭제하기 위해 당신의 매핑에 CASCADE를 사용해야합니다. 외부 키가 employee 인 모든 certificates이 삭제됩니다.

<class name="Certificate" table="CERTIFICATE" cascade="delete-orphan, save-update" > 
    <id name="id" type="int" column="id"> 
    <param name="sequence">certificate_seq</param> 
    </id> 

    <property name="name" column="certificate_name"/> 

    <key> 
    <property name="employee_id" column="employee_id" insert="false" update="false" not-null="true"/> 
    </key> 
    <one-to-many class="com.your.package.Certificate" /> 

</class> 

지금 당신은 당신의 employee 클래스에서 certificates 수집을 수정할 수 있습니다. employee.saveOrUpdate을하면 인증서가 그에 따라 저장/제거됩니다.

나는 이것을 테스트하지 않았습니다. 그러나 당신은 아이디어를 얻어야합니다. Here은 계단식 유형의 예입니다.

+0

클래스 인증서에이 값을 추가하면이 오류가 발생합니다. "클래스"요소 유형에 대해 특성 "계단식"을 선언해야합니다. –

관련 문제