考慮下面的類:完整性contraint違反時,試圖調用保存多次
@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
)以及從超類DaoBase
延伸的域道(MyDomainDao
)。它是在這個超類中持久化會話被調用的,並且這個超類也有責任保存/更新/刪除實體類。通過繼承,子類只需要定義特定於孩子的方法。
當我運行單元/集成測試MyDomainDaoTest
時,問題就開始了。我想測試MyDomainDao
中定義的方法doSomething()
。爲了做到這一點,我需要在數據庫中有五個測試行(我正在使用內存中的HSQLDB),因此在方法setupListOfMyDomain()
中循環。什麼是奇怪的循環是,我得到了第二次迭代這個錯誤:
ERROR JDBCExceptionReporter - integrity constraint violation: unique constraint or index violation; SYS_CT_10231 table: MyDomain
它不能比這神祕的。我知道在第一次迭代時會生成一個ID。爲什麼如果我試圖保留另一個對象,爲後續迭代獲得完整性約束違規?
SYS_CT_10231是約束的名稱。用你使用的任何數據庫工具在數據庫中尋找它。 – OldProgrammer 2013-02-19 13:33:04
我可能會這樣做,但我在內存中使用HSQLDB(意味着數據庫不是作爲平面/系統文件生成的)。我不確定我是否可以在運行時獲取生成的表的元數據。 – 2013-02-19 13:36:52