【问题标题】:@Generated in HSQL DB@在 HSQL 数据库中生成
【发布时间】:2011-11-12 18:03:36
【问题描述】:

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

现在在上表的实体中,就在 RECORD_ID 字段的上方,我使用休眠注释 @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();
}

【问题讨论】:

  • 您是说生产代码按预期工作,但单元测试中的类似代码却没有,对吗?如果是这样,请向我们展示单元测试代码。
  • 你的列在HSQLDB中的定义是什么?可以发CREATE TABLE 声明吗?
  • @JB Nizet 是的 JB.. 也会发布单元测试代码
  • @JB Nizet 请在上面找到我的单元测试代码
  • 你能看到数据库中的RECORD_ID确实为空吗?你能看到 Hibernate 生成的子序列选择查询,用于在插入后从数据库中读取生成的 RECORD_ID 吗?您确定您的测试数据库具有实际生成 RECORD_ID 的触发器吗?

标签: java hibernate unit-testing junit hsqldb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 但是这里的 RECORD_ID 不是主键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多