0

在我的项目中,我有很多 hbm.xml 文件,我从中生成 java 类和 db 的 sql。hbm.xml 文件中的语义错误在调用 buildSessionFactory() 后显示给我,这对于当前情况来说真的很烦人。我想有一个测试类,它用稍微不同的配置为我做这件事(改用 ebedded derby)。我目前的“解决方案”是这样的:

    String dbName = "test";

    try{
        SessionFactory fact = new Configuration().configure()
                                                 .setProperty("hibernate.connection.driver_class","org.apache.derby.jdbc.EmbeddedDriver")
                                                 .setProperty("hibernate.connection.url","jdbc:derby:" + dbName + ";create=true")
                                                 .setProperty("hibernate.connection.username","")
                                                 .setProperty("hibernate.connection.password","")
                                                 .setProperty("hibernate.dialect","org.hibernate.dialect.DerbyDialect")
                                                 .setProperty("hibernate.hbm2ddl.auto","create-drop")
                                                 .buildSessionFactory();
        assertNotNull(fact);

        Session s = fact.openSession();
        assertNotNull(s);

        s.close();
        fact.close();
    }catch(Throwable t){
        fail(t.getMessage());
    }

但从我的角度来看,这并不令人满意。我还想检查命名查询等是否一切正常。有没有办法在自动化过程中进行这种测试?

我的问题的第二部分是,如果 derby 是一个不错的测试选择,为什么我不能在测试结束后自动删除数据库?我想在 url 中指定一个参数,例如

    "jdbc:derby:" + dbName + ";create=true;drop=true"

通过使用这个解决方案,我最终在我的项目目录中得到了一个名为变量 dbName 的目录和一个 derby 文件,这并不酷。

4

1 回答 1

0

如果您想测试您的命名查询,一个解决方案可能是在测试中使用虚假参数调用它们(查询可能不会返回任何内容,但至少它会强制休眠检查它们);类似于:

 s.getNamedQuery("Whatever").setParameters(...).execute/query

现在您的问题是您无法轻松获取所有查询的名称吗?

至于 derby db,您不能在测试结束时“手动”删除创建的文件夹(例如,在 tearDown 中?)

似乎可以使用 java 属性控制创建 derby 基础的位置:

http://db.apache.org/derby/manuals/develop/develop14.html

http://db.apache.org/derby/manuals/develop/develop12.html#HDRSII-DEVELOP-13018

于 2011-07-07T21:44:50.213 回答