0

OneToMany 単方向関係を持つマスター子テスト ケースを試しています。子リストからいくつかのエントリを削除してマスターを更新するシナリオがあります。マージを行うとき、これらの子エントリが自動的に削除されるようにします。

私はこれを機能させるために無駄に試みました。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)

サブアカウントは削除されると思います。

4

1 に答える 1

0

カスケード・タイプが cascade-all または cascade-remove に設定されている場合、OpenJPA は orphan-removal 動作をオーバーライドします。

cascade-all の代わりに、cascade-persist、cascade-merge、cascade-refresh、cascade-detach を使用して cascade-type を構成する必要がありました。

于 2013-01-25T10:29:55.367 に答える