我使用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。
任何想法?
答案 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可以/必须是一个单独的。