@Generated in HSQLDB

时间:2011-09-08 07:13:08

标签: java hibernate unit-testing junit hsqldb

假设在数据库表中有一个名为RECORD_ID的非键列,它在数据库中自动生成/排序。

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

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

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

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

现在,当我创建fixture并调用我的测试时,当我保存我的fixture时,HSQL不会为记录的RECORD_ID生成值。它将它保留为null。但我打算测试的逻辑是基于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();
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在你的情况下,主键不是RECORD_ID吗?

在这种情况下,您应该将@GeneratedValue与@Id注释一起使用。

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