2012-05-17 72 views
6

对不起,如果这似乎是重复的 - 但其他职位的答案没有帮助。我正在开发一个应用程序,其中的数据库细节存储在其他地方,我必须从这个标准位置读取它。我在我的程序根目录中有hibernate.properties和hibernate.cfg.xml文件,并且我也有以下配置,它被设置为programmaticaly(值被硬编码,直到我得到它的工作...):休眠配置文件和代码

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文件。)

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

但是,我得到的行为如下所示:如果我将所有配置都放在hibernate.properties中,它可以很好地工作(即休眠选取属性文件)。如果我只将用户名和密码放在代码中,它会以“无效的用户/密码”失败。就好像我以编程方式设置的属性始终被忽略。您大概可以猜到,如果我在两个地方都放置了细节,则会使用配置文件中的设置。

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

任何想法?


更新:我在两个地方都添加了一个用户/密码。该文件被称为“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,...

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

回答

6

好吧..我对新旧版本的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); 
... 

...和它的作品。