0

我使用 Hibernate 和 Derby。

我有一个 hibernate.cfg.xml 和我为使用 db waas 所做的一切来获得一个 Session :

  return new AnnotationConfiguration().configure( "files/hibernate.cfg.xml"   ).buildSessionFactory().getCurrentSession();

我的 hibernate.cfg.xml 包含

   <property name="connection.driver_class">org.apache.derby.jdbc.EmbeddedDriver</property>
   <property name="connection.url">jdbc:derby:crmdb;create=true</property>

以及实体类的一些其他属性和映射。

现在我想在运行时为 derby db 和 bootPassword 设置 dataEncryption。

我改变了 hibernate.cfg.xml :

    <property name="connection.url">jdbc:derby:crmdb;create=true;dataEncryption=true;bootPassword=myPass</property>

一切都很好。

现在我想在运行时设置 bootPassword,例如从环境变量中读取。那就是问题所在!当我从 hibernate.cfg.xml 中删除“connection.url”并尝试在我的代码中设置它时,会出现此错误:

 java.lang.UnsupportedOperationException: The application must supply JDBC connections

如果我只删除 bootPassword,它就无法连接到数据库。

任何的想法 ?

4

2 回答 2

1

它解决了!

我应该设置“hibernate.connection.url”而不是“connection.url”!

于 2013-11-15T11:35:04.923 回答
0

在构建 sessionFactory 之前需要修改配置:

private SessionFactory sessionFactory;

public SessionFactory getSessionFactory(){
    if(sessionFactory==null){
        Configuration configuration = new AnnotationConfiguration().configure( "files/hibernate.cfg.xml"   );
        configuration.setProperty("hibernate.connection.url", "jdbc:derby:crmdb;create=true;dataEncryption=true;bootPassword="+password);
        configuration.configure();
        sessionFactory = configuration.buildSessionFactory();
    }
    return sessionFactory;
}

其他说明:你必须避免每次都重新创建一个新的SessionFactory(这需要很多时间,消耗大量资源并且没有用)。即,您必须为每个 bootPassword 创建一个 sessionFactory(因为它是唯一的动态部分),如果您只有一个 bootPassword - 即一个单独的 DB - 那么您的 sessionFactory 可以/必须是单例。

参考

于 2013-11-15T10:25:44.363 回答