1

サブクラスごとにテーブルをマップしたテーブルがいくつかあります。

階層の最上位には、Composite Primary Key クラスを含む EmployeeTransaction があります。

public class EmployeeTransaction implements Serializable {

    private TransactionCompositeId id;

    @Id
    public TransactionCompositeId getId() { // etc }}

}

    public static class TransactionCompositeId implements Serializable {

        public String employeeId;
        public Long transactionId;

        // getters/setters
    }

したがって、私が持っている子クラスの 1 つが HiringTransaction であると考えてください。

@PrimaryKeyJoinColumns(//etc)
public class HiringTransaction extends EmployeeTransaction implements Serializable {

    // etc
}

現在、EmployeeTransaction を独自に作成する必要があり、後で子クラスの 1 つに関連付けない場合があります。

NonUniqueObjectException が発生する単体テストのコードを次に示します。

@Test
@Rollback(false)
public void testSave()
{
    final TransactionCompositeId id = new TransactionCompositeId("777777777",553942L);

    EmployeeTransaction pt = new EmployeeTransaction();                pt.setId(id);
    pt.setLastUpdate(date);
    pt.setLastUpdatedBy(user);
    pt.setCreatedBy(user);
    pt.setCreationDate(date);
                // various setters

    employeeTransactionDAO.save(pt);


    //EmployeeTransaction pt1 = employeeTransactionDAO.get(id); 

    TransactionCompositeId newId = new TransactionCompositeId("777777777",553942L);
    HiringTransaction eth = new HiringTransaction();            
                BeanUtils.copyProperties(pt, eth);
    //HiringTransaction eth = (HiringTransaction) pt;
    //HiringTransaction eth = new HiringTransaction(pt);
    eth.setId(newId);
                // various setters/getters

    dao.save(eth);


    HiringTransaction tempEth = dao.get(id);
    assertNotNull("HiringTransaction should not be null", tempEth);

    dao.remove(id);
    ptDAO.remove(id);
    tempEth = dao.get(id);
    EmployeeTransaction tempPt = ptDAO.get(id);
    assertNotNull("EmployeeTransaction should not be null", tempEth);
    assertNotNull("HiringTransaction should not be null", tempPt);
}

私が疑っているのは、これらのアクティビティの両方を 1 つの UnitOfWork 内に置くことができないということです。ただし、NonUniqueObjectException を回避する方法がわかりません。マッピングはサブクラスごとのテーブルであるため、id は間違いなく同じです。

注: DAO は、session.save()、session.merge() などを呼び出す単純な汎用 DAO です。

4

1 に答える 1

2

同じ ID を持つ EmployeeTransaction の 2 つの異なる永続インスタンスを作成しようとしています。これは不可能です。EmployeeTransaction を削除し、(おそらく) セッションをフラッシュしてから、新しいセッションを同じ ID で保存する必要があります。

元の EmployeeTransaction への関連付けもすべて削除する必要があることに注意してください。それが不可能な場合は、継承関係ではなく、合成関係を作成する必要があります。つまり、1 つの EmployeeTransaction には (ゼロまたは) 1 つの HiringTransaction があります。

于 2012-08-06T20:34:48.030 に答える