2011-09-08 65 views
0

假设在数据库表中有一个非关键列,称为RECORD_ID,它在数据库中自动生成/排序。@产生于HSQL DB

现在在上面表格的实体中,RECORD_ID字段的上方,我使用hibernate annotation @Generated来指示休眠,DB将负责将值插入到特定字段中。它看起来像下面这样:

@Column(name = "RECORD_ID", unique = true, nullable = true, insertable = false, updatable = false) 
    @Generated(GenerationTime.INSERT) 
    private Long recordId; 

我运行我的代码,它工作正常。 DB按预期插入值。

现在,我用HSQL编写一个单元测试用例来确保我的逻辑完好无损。 该逻辑具有一个基于RECORD_ID获取记录的查询。

现在,当我创建夹具并调用我的测试时,HSQL在保存夹具时不会为记录的RECORD_ID生成值。它将其保留为空。但是我打算测试的逻辑是基于RECORD_ID获取的,这在这里是不可能的。

它只是在HSQL DB中保持为空。因此我无法完成单元测试!

请注意解决此问题或解决方法。

请在下面找到

@Test 
public void testProductCancelDAL() { 
    savePrerequisites(); 
    Logic myLogic = new Logic(); 
    /* Logic fetches the reservation record based on RECORD_ID */ 
    assertNotNull(myLogic.invoke()); 

} 
public void savePrerequisites() { 
    //Stroing product type 
    Product product = ProductFixture.createProduct(); 
    sessionFactory.getCurrentSession().save(product); 

    //Storing Itinerary 
    Itinerary itn = ItnFixture.create(); 
    sessionFactory.getCurrentSession().save(itn); 

    Reservation res = ReservationFixture.create(); 
    sessionFactory.getCurrentSession().save(res); 
    sessionFactory.getCurrentSession().flush(); 
} 
+0

你是说生产代码按预期工作,但单元测试中类似的代码没有,是吗?如果是这样,那么向我们展示单元测试代码。 –

+0

HSQLDB中列的定义是什么?你可以发布一个CREATE TABLE语句吗? –

+0

@JB Nizet是对的JB..Will也会发布单元测试代码 – Sripaul

回答

2

根据您在评论中所说的话,您似乎正在测试一些代码,这些代码依赖于生成RECORD_ID的数据库中的触发器,但是您在内存数据库中测试此触发器时,不存在。显然,这是行不通的。您需要创建与生产数据库中相同的触发器。请参阅http://hsqldb.org/doc/2.0/guide/triggers-chapt.html在HSQLDB数据库中创建触发器。

1

在你的情况下,单元测试代码,是不是RECORD_ID主键?

在这种情况下,您应该使用具有@Id注释的@GeneratedValue。

数据库生成值的问题是插入后必须重新读取记录(它不适用于AUTOINCREMENT列,其中最后生成的ID可以通过专用指令读取)。

+0

但这里的RECORD_ID不是主键 – Sripaul