次のクラスを検討してください。
@Entity
public class MyDomain{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
private AnotherDomain anotherDomain;
//getters and setters here
}
@Repository
public MyDomainDao extends DaoBase<MyDomain>{
public List<MyDomain> doSomething(AnotherDomain parameter){
//code does something here
}
}
public class DaoBase<I>{
@Autowired
private SessionFactory sessionFactory;
public void save(I object){
sessionFactory.getCurrentSession().saveOrUpdate(object);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:context.xml"})
@Transactional(propagation = Propagation.REQUIRED)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class MyDomainDaoTest {
@Autowired
private MyDomainDao dao;
@Mock
private AnotherDomain anotherDomain;
@Before
public void setUp() {
this.setupListOfMyDomain();
}
@Test
public void testDoSomething(){
//test the method here
}
private void setupListOfMyDomain(){
MyDomain domain = null;
//five rows of MyDomain
for(int i=0; i<=4; i++){
domain = new MyDomain();
domain.setAnotherDomain(anotherDomain);
dao.save(domain);
}
}
}
要約すると、私は単純なエンティティクラス( )とスーパークラスから拡張されMyDomain
たドメインdao( )を持っています。永続性のセッションが呼び出されるのはこのスーパークラスであり、エンティティクラスを保存/更新/削除するのもこのスーパークラスの責任です。継承により、サブクラスは子固有のメソッドを定義するだけで済みます。MyDomainDao
DaoBase
ユニット/統合テストを実行すると、問題が発生しますMyDomainDaoTest
。doSomething()
で定義されているメソッドをテストしたかったのMyDomainDao
です。これを行うには、データベース内の5つのテスト行(メモリ内でHSQLDBを使用しています)、つまりメソッド内のループを実行する必要がありますsetupListOfMyDomain()
。ループの奇妙な点は、2回目の反復でこのエラーが発生することです。
エラーJDBCExceptionReporter-整合性制約違反:一意性制約またはインデックス違反。SYS_CT_10231テーブル:MyDomain
それ以上の謎めいたものを手に入れることはできません。IDが最初の反復で生成されることを知っています。別のオブジェクトを永続化しようとすると、後続の反復で整合性制約違反が発生するのはなぜですか?