2012-05-17 69 views
6

對不起,如果這似乎是重複的 - 但其他職位的答案沒有幫助。我正在開發一個應用程序,其中的數據庫細節存儲在其他地方,我必須從這個標準位置讀取它。我在我的程序根目錄中有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()); 

(請注意,其他設置,如方言存儲在hibernate.properties文件。)

據我瞭解,配置()會加載默認屬性/映射吧?我的「setProperty()」語句將覆蓋標準設置,對吧?

但是,我得到的行爲如下所示:如果我將所有配置都放在hibernate.properties中,它可以很好地工作(即休眠選取屬性文件)。如果我只將用戶名和密碼放在代碼中,它會以「無效的用戶/密碼」失敗。就好像我以編程方式設置的屬性始終被忽略。您大概可以猜到,如果我在兩個地方都放置了細節,則會使用配置文件中的設置。

我想要的是我以編程方式設置的設置必須覆蓋屬性文件中的所有設置。

任何想法?


更新:我在兩個地方都添加了一個用戶/密碼。該文件被稱爲「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,...

這意味着代碼中的設置被處理......但是,由於某種原因被忽略...

回答

6

好吧..我對新舊版本的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); 
... 

...和它的作品。