抱歉,如果这似乎是重复的-但其他帖子的答案无济于事。我正在开发一个应用程序,其中数据库详细信息存储在其他地方,我必须从此标准位置读取它。我的程序根目录中有文件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 =设置代码,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,....
这意味着代码中的设置已处理...但是,由于某些原因而被忽略...
最佳答案
好的..我在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);
...
...而且有效。
关于java - 文件和代码中的Hibernate配置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10631608/