对不起,如果这似乎重复 - 但其他帖子的答案没有帮助.我正在开发一个应用程序,其中数据库详细信息存储在其他地方,我必须从这个标准位置读取它.我在我的程序根目录中有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());
Run Code Online (Sandbox Code Playgroud)
(请注意,其他设置(如dialect)存储在hibernate.properties文件中.)
据我了解,configure()会加载默认的属性/映射吗?我的"setProperty()"语句将覆盖标准设置,对吗?
但是,我得到的行为如下:如果我将所有配置放在hibernate.properties中,它可以正常工作(即hibernate选择属性文件).如果我只在代码中输入用户名和密码,则会因"user/pass"无效而失败.好像我以编程方式设置的属性总是被忽略.您可以猜测,如果我将细节放在两个位置,则使用配置文件中的设置.
我想要的是我以编程方式设置的设置必须覆盖属性文件中的任何设置.
有任何想法吗?
更新:我在两个地方添加了用户/通行证.该文件被称为"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,....
这意味着代码中的设置被处理......但是,由于某种原因被忽略了......
好的..我在旧版和新版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);
...
Run Code Online (Sandbox Code Playgroud)
......它有效.