java - @在HSQL数据库中生成

标签 java hibernate unit-testing junit hsqldb

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

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

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

我运行了我的代码,它工作得很好。数据库正在按预期插入值。

现在,我使用 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();
}

最佳答案

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

关于java - @在HSQL数据库中生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7344433/

相关文章:

java - 如何终止套接字连接上的线程阻塞

java - jOOQ,Java - 如何导入生成的 java 文件?

java - LazyInitializationException 尽管有 OpenSessionInViewFilter

c# - nunit-console 不运行使用 TestCase 属性参数化的测试

c++ - 如何将一个 exe 项目链接到另一个 exe 项目中的类

java - 使用 Java 刷新 Windows 上的 Internet 选项

java LocalExecute 进程退出值 127

java - Hibernate缓存和MySql查询缓存

mysql - Spring Boot+Hibernate向mysql插入空值

python - Flask:可以创建自定义 302(重定向)页面吗?