2009-11-17 83 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文件中获得什么信息?