2011-05-24 77 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