7

抱歉,如果这似乎是重复的 - 但其他帖子上的答案没有帮助。我正在开发一个应用程序,其中数据库详细信息存储在其他地方,我必须从这个标准位置读取它。我的程序根目录中有 hibernate.properties 和 hibernate.cfg.xml 文件,并且我还有以下配置,这些配置是通过编程设置的(这些值是硬编码的,直到我让它工作......):

Configuration configuration = new Configuration().configure();

configuration.setProperty("hibernate.connection.driver_class", "oracle.jdbc.pOracleDriver");
configuration.setProperty("hibernate.connection.url", "jdbc:oracle:thin:@dte_datalayer:1521:DTE");
configuration.setProperty("hibernate.connection.username", "testuser");
configuration.setProperty("hibernate.connection.password", "testpass");

SessionFactory sessionFactory = configuration.buildSessionFactory(new ServiceRegistryBuilder().buildServiceRegistry());

(请注意,方言等其他设置存储在 hibernate.properties 文件中。)

据我了解, configure() 将加载默认属性/映射对吗?我的“setProperty()”语句将覆盖标准设置,对吧?

但是,我得到的行为如下:如果我将所有配置放在 hibernate.properties 中,它会完美运行(即 hibernate 获取属性文件)。如果我只在代码中输入用户名和密码,它会因“无效用户/密码”而失败。就好像我以编程方式设置的属性总是被忽略。您可能会猜到,如果我将详细信息放在这两个地方,则会使用配置文件中的设置。

我想要的是我以编程方式设置的设置必须覆盖属性文件中的任何设置。

有任何想法吗?


更新:我在两个地方都添加了一个用户/通行证。该文件称为“set-in-file”,代码称为“set-in-code”。然后我在创建 SessionFactory 之前添加了一个 System.out.println() ......我得到了这个(部分截图):

java.runtime.name=Java(TM) SE 运行环境,hibernate.connection.password=set-in-code,hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider,sun.boot.library.path=/usr /lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64, java.vm.version=20.1-b02, hibernate.connection.username=testuser, ....

这意味着代码中的设置被处理......但是,由于某种原因被忽略了......

4

1 回答 1

9

好的..我对Hibernate的新旧版本感到困惑......问题出在最后一行。

我将代码替换为:

Configuration configuration = new Configuration();
configuration.configure();

configuration.setProperty("hibernate.connection.username", "whomever");
configuration.setProperty("hibernate.connection.password", "whatever");

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
...

......它的工作原理。

于 2012-05-17T09:27:45.563 回答