2013-01-24 4 views
0

OneToMany 단방향 관계로 마스터 하위 테스트 케이스를 시험하고 있습니다. 하위 목록에서 일부 항목을 제거하여 마스터를 업데이트하려는 시나리오가 있습니다. 병합을 수행 할 때이 하위 항목을 자동으로 삭제하려고합니다.OpenJPA 고아 제거가 작동하지 않습니다.

나는이 작업을하기 위해 헛되이 노력했다. 나는 orphanremoval도 시도했지만 너무 도움이되지 않았다. equals와 hashcode를 추가하라는 제안이있었습니다.

이 점에 대한 힌트 또는 도움을 주실 수 있습니다. 고맙습니다.

내가는 OpenJPA 2.1.0

와 JPA2.0를 사용하고 여기에 내 코드입니다.

//Parent class 
public class Account { 
    private String accountId; 
    private String accountNumber; 
    private List<SubAccount> subAccounts; 

    //followed by getters/setters 
} 

//Child class 
public class SubAccount { 
    private String subAccountId; 
    private String subAccountNumber; 
    //followed by getters/setters 
} 

내 orm.xml은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<entity-mappings version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"> 

    <entity name="Account" class="test.data.Account"> 
     <table name="ACCOUNT" /> 

     <sequence-generator name="AccountSeq" 
      sequence-name="ACCOUNT_TEST_SEQ" /> 

     <attributes> 

      <id name="accountId"> 
       <column name="ACCOUNT_ID" /> 
       <generated-value strategy="SEQUENCE" generator="AccountSeq" /> 
      </id> 

      <basic name="accountNumber"> 
       <column name="ACCOUNT_NO" /> 
      </basic> 

      <one-to-many name="subAccounts" fetch="EAGER" 
       target-entity="test.data.SubAccount" orphan-removal="true" > 
       <join-column name="ACCOUNT_ID" referenced-column-name="ACCOUNT_ID" nullable="false" updatable="true"/> 
       <cascade> 
        <cascade-all /> 
       </cascade> 
      </one-to-many> 

     </attributes> 
    </entity> 

    <entity name="SubAccount" class="test.data.SubAccount"> 
     <table name="SUBACCOUNT" /> 

     <sequence-generator name="SubAccountSeq" 
      sequence-name="SUBACCOUNT_TEST_SEQ" /> 

     <attributes> 
      <id name="subAccountPK"> 
       <column name="SUBACCOUNT_ID" /> 
       <generated-value strategy="SEQUENCE" generator="AccountSeq" /> 
      </id> 
      <basic name="subAccountNumber"> 
       <column name="SUBACCOUNT_NO" /> 
      </basic> 
     </attributes> 
    </entity> 

</entity-mappings> 

그리고 이것이 내가하려는 일입니다.

Account acc = (Account)entityMgr.find(Account.class, "1100") 
acc.getSubAccounts().remove(0); 
entityMgr.merge(acc) 

하위 계정이 삭제 될 것으로 예상됩니다.

답변

0

계단식 유형이 계단식 모두 또는 계단식 제거로 설정된 경우 OpenJPA는 분리형 제거 동작보다 우선합니다.

cascade-all 대신 cascade-persist, cascade-merge, cascade-refresh 및 cascade-detach를 사용하여 캐스케이드 유형을 구성해야했습니다.

+0

위의 시나리오에서 작동하지만 계단식 삭제가 명백한 이유로 작동하지 않습니다. – praveenj

관련 문제