尝试多次调用保存时违反完整性约束

时间:2013-02-19 13:29:40

标签: java hibernate hsqldb

考虑以下课程:

@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。如果我试图保留另一个对象,为什么我会在后续迭代中获得完整性约束违规?

1 个答案:

答案 0 :(得分:1)

我认为您的映射存在问题。您在MyDomainAnotherDomain之间声明了一对一的关系,但在您的单元测试中,MyDomain的5个实例共享AnotherDomain的同一个实例,因此您应该使用而是一种多对一的关系。