考虑以下类:
@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
当我运行 unit/integration test 时,问题就开始了MyDomainDaoTest
。我想doSomething()
测试MyDomainDao
. 为了做到这一点,我需要在数据库中测试五行(我在内存中使用 HSQLDB),因此方法中的循环setupListOfMyDomain()
。循环的奇怪之处在于我在第二次迭代中得到了这个错误:
错误 JDBCExceptionReporter - 完整性约束违规:唯一约束或索引违规;SYS_CT_10231 表:我的域
它没有比这更神秘的了。我知道在第一次迭代时会生成一个 ID。如果我试图持久化另一个对象,为什么会在后续迭代中违反完整性约束?