使用hibernate在运行时为derby数据库设置bootPassword

时间:2013-11-15 09:53:18

标签: java xml hibernate derby

我使用Hibernate和Derby。

我有一个hibernate.cfg.xml以及我为使用db waas获取会话所做的一切:

  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,e.x.by从环境变量中读取。那就是问题所在! 当我从hibernate.cfg.xml中删除“connection.url”并尝试在我的代码中设置它时,此错误发生在:

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

如果我只删除bootPassword,则无法连接到db。

任何想法?

2 个答案:

答案 0 :(得分:1)

它解决了!

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

答案 1 :(得分: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 - 即一个单独的数据库 - 那么你的sessionFactory可以/必须是一个单独的。

ref