考虑下面的类:完整性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