サブクラスごとにテーブルをマップしたテーブルがいくつかあります。
階層の最上位には、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 です。