2013-02-19 55 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

相關問題