2011-05-24 98 views
2

我有一个由源代码和测试类组成的源代码树。当我运行测试时,我想使用<property name="hbm2ddl.auto">create</property>,而在运行代码时我想使用validate值而不是创建。 我以为使用两个配置文件,其中一个具有所有属性并包含hbm2ddl.auto设置为验证,另一个设置为创建hbm2ddl.auto。我希望下面的代码允许我从测试中读取基本文件并覆盖唯一的hbm2ddl.auto propery,但它不起作用(hbm2ddl.auto的值仍然是从hibernate.cfg读取的值。 XML。休眠:用另一个文件覆盖xml配置文件

Configuration configuration = new Configuration(); 
configuration = configuration. 
    configure("hibernate.cfg.xml"). 
    addResource("hibernate-test.cfg.xml"); 

我怎么能有两个不同的值的属性,不复制整个配置文件?

回答

5

在我看来,当你只有几个值覆盖,一个简单的办法是加载XML配置像往常一样,然后调用setProperty编程,就像这样:

Configuration configuration = new Configuration(); 
configuration = configuration.configure("hibernate.cfg.xml"); 
configuration.setProperty("hibernate.hbm2ddl.auto", "create-drop"); 

的hbm.xml文件不允许覆盖addResource(...)的值,因为我试图这样做,这些值只会被添加并且不会被覆盖

+0

我想通过使用'org.hibernate.cfg.Configuration.addURL(urlForXmlWithOverrides)'重写'connection.url',并获得相同的结果:连接URL不是覆盖。不过,我发现当没有原始值时,它也不起作用,即传递给'configure(URL)'方法的文件完全不包含该属性。因此,我不确定这些值甚至会被添加。无论如何,我会使用你的方法 - 它不是特别优雅,但至少它是有效的。 :-) 谢谢。 – 2013-01-17 08:57:45

+1

我改用属性名'hibernate.connection.url'来解决我的问题。我不是使用'setProperty',而是从流中读取属性并使用'Configuration.addProperties(Properties)',但它基本上与你正在做的事情是一样的。 在任何情况下,似乎'addProperties'与其他'add'方法不同,因为它们添加_properties_而不是_mappings_。我还没有发现这个区别是什么。我会发布一个答案,如果我这样做。 – 2013-01-18 02:36:08

0

我有这个问题,试图以编程方式加载其他的配置。解决我所用的是有另一个hibernate.properties文件(而不是xml config)您可以在此属性文件中设置替代hibm2ddl值并使用以下代码加载它:

 Properties props = new Properties(); 
     props.load(new FileInputStream(propFile)); 
     configuration = new Configuration().setProperties(props); 

试试看看它是否适用于您。

Imp:不要调用configuration.configure()。

+0

对不起,延迟回复:您的方法允许加载不同的属性文件,但我想加载“基本”属性文件加上另外一个,这将覆盖一些属性。已解决,因为我要写 – cdarwin 2011-07-13 21:47:13