2009-11-17 118 views

回答

5

可能不是沒有使用反射和依靠Hibernate在未來不會破壞你的代碼。您需要從SessionFactory獲取屬性,但它不是公共的,因此您必須通過反射來查找字段,然後使用field.setAccessible來訪問它。例如:

Field f = SessionFactoryImpl.class.getDeclaredField("properties"); 
f.setAccessible(true); 
Properties p = (Properties)f.get(sessionFactory); 

然後使用環境中的常量拉出相關設置。如果您正在查找實際的數據庫連接設置,並且您的應用程序正在使用jndi,那麼可以使用jndi名稱來獲取DataSource並檢查它以獲取連接信息。

對於這種類型的事情,我通常只使用調試器,設置一個斷點,然後在變量周圍徘徊,直到找到信息的位置;然後查看它是否公開可用,如果不是,則使用反射來實現它。雖然沒有保證。

+0

sessionFactory無法解析爲變量。我怎樣才能得到一個?我通過SessionFactory *類搜索得到一個實例,但我不知道我在做什麼。我手頭上有一個javax.persistance.EntityManager –

+1

我沒有使用EntityManager,但它看起來像Hibernate的實現是HibernateEntityManager,它有一個getSession方法。一旦你有會話,你可以獲得SessionFactory。所以像((HibernateEntityManager)entityManager).getSession()。getSessionFactory() –

+0

它的工作,謝謝! –

3

如果您使用JDBC,則可以始終獲取連接及其元數據。如果你正在使用Spring的事務管理器,你可以得到這樣的:

transactionManager.getDataSource().getConnection().getMetaData() 

這說明tons of information有關數據庫及其連接,包括用戶名。在persistence.xml中有一些信息可能涉及數據庫連接池,這些數據庫連接池通常不會存儲在Hibernate中的任何地方,而是存儲在實際的連接池代碼中。

你需要從persistence.xml文件中獲得什麼信息?