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)
하위 계정이 삭제 될 것으로 예상됩니다.
위의 시나리오에서 작동하지만 계단식 삭제가 명백한 이유로 작동하지 않습니다. – praveenj