2013-02-19 33 views
0

考虑下面的类:完整性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。为什么如果我试图保留另一个对象,为后续迭代获得完整性约束违规?

+0

SYS_CT_10231是约束的名称。用你使用的任何数据库工具在数据库中寻找它。 – OldProgrammer 2013-02-19 13:33:04

+0

我可能会这样做,但我在内存中使用HSQLDB(意味着数据库不是作为平面/系统文件生成的)。我不确定我是否可以在运行时获取生成的表的元数据。 – 2013-02-19 13:36:52

回答

1

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

+0

宾果〜!我将注释从'@ OneToOne'改为'@ ManyToOne',安装程序完成。我以前从来没有使用'@ ManyToOne'。我现在有。谢谢〜! – 2013-02-19 23:54:48

相关问题