Java Hibernate:用另一个文件覆盖xml配置文件
我有一个由源类和测试类组成的源代码树。运行测试时,我希望使用Java Hibernate:用另一个文件覆盖xml配置文件,java,unit-testing,hibernate,Java,Unit Testing,Hibernate,我有一个由源类和测试类组成的源代码树。运行测试时,我希望使用create,而运行代码时,我希望使用validate值而不是create。 我想使用两个配置文件,一个包含所有属性并包含hbm2ddl.auto集进行验证,另一个包含hbm2ddl.auto集进行创建。我希望下面的代码能够让我从测试中读取基本文件并覆盖唯一的hbm2ddl.auto属性,但它不起作用(hbm2ddl.auto的值仍然是从hibernate.cfg.xml读取的值) Configuration configuration
create
,而运行代码时,我希望使用validate
值而不是create。
我想使用两个配置文件,一个包含所有属性并包含hbm2ddl.auto集进行验证,另一个包含hbm2ddl.auto集进行创建。我希望下面的代码能够让我从测试中读取基本文件并覆盖唯一的hbm2ddl.auto属性,但它不起作用(hbm2ddl.auto的值仍然是从hibernate.cfg.xml读取的值)
Configuration configuration = new Configuration();
configuration = configuration.
configure("hibernate.cfg.xml").
addResource("hibernate-test.cfg.xml");
在不复制整个配置文件的情况下,如何为一个属性设置两个不同的值?我在尝试以编程方式加载另一个配置时遇到了问题。我以前的解决方法是使用另一个hibernate.properties文件(而不是xml config)。您可以在此属性文件中设置备用hibm2ddl值,并使用以下代码加载该值:
Properties props = new Properties();
props.load(new FileInputStream(propFile));
configuration = new Configuration().setProperties(props);
试试看这对你是否有效
Imp:不要调用configuration.configure()。在我看来,当您只有几个值要覆盖时,一种简单的方法是像往常一样加载xml配置,然后以编程方式调用
setProperty
,如下所示:
Configuration configuration = new Configuration();
configuration = configuration.configure("hibernate.cfg.xml");
configuration.setProperty("hibernate.hbm2ddl.auto", "create-drop");
hbm.xml文件不允许用
addResource(…)
覆盖值正如我试图做的那样,这些值只被添加而没有被覆盖很抱歉回复延迟:您的方法允许加载不同的属性文件,但我想加载“base”属性文件加上一个附加文件,它将覆盖一些属性。在我编写时已隔离我正在尝试使用org.hibernate.cfg.Configuration.addURL(urlForXmlWithOverrides)覆盖connection.url
,并得到相同的结果:连接URL没有被覆盖。但是,我发现当没有原始值时,即传递给配置(URL)的文件也不起作用
方法根本不包含该属性。因此,我不确定是否添加了值。无论如何,我将使用您的方法它不是特别优雅,但至少可以工作。:-)谢谢。我使用属性名“hibernate.connection.url”解决了我的问题。我从流中读取属性并使用Configuration.addProperties(properties)
,而不是setProperty
,但基本上与您所做的相同。在任何情况下,addProperties
似乎都不同于其他“add”方法,因为它们添加属性而不是映射。我还没有发现这种区别是为了什么;如果我这样做了,我会发布一个答案。