考虑以下课程:
@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
)和一个从超类MyDomainDao
扩展的域dao(DaoBase
)。在这个超类中,调用持久性的会话,这个超类也负责保存/更新/删除实体类。凭借继承,子类只需定义特定于子的方法。
当我运行单元/集成测试MyDomainDaoTest
时,问题就开始了。我想测试doSomething()
中定义的方法MyDomainDao
。为了做到这一点,我需要在数据库中使用五个测试行(我在内存中使用HSQLDB),因此方法setupListOfMyDomain()
中的循环。循环的奇怪之处在于我在第二次迭代时遇到了这个错误:
ERROR JDBCExceptionReporter - integrity constraint violation: unique constraint or index violation; SYS_CT_10231 table: MyDomain
它不能得到任何神秘的东西。我知道在第一次迭代时会生成一个ID。如果我试图保留另一个对象,为什么我会在后续迭代中获得完整性约束违规?
答案 0 :(得分:1)
我认为您的映射存在问题。您在MyDomain
和AnotherDomain
之间声明了一对一的关系,但在您的单元测试中,MyDomain
的5个实例共享AnotherDomain
的同一个实例,因此您应该使用而是一种多对一的关系。