【发布时间】:2010-01-06 17:38:47
【问题描述】:
我注意到调用createEntityManagerFactory(null) 将使用配置文件中的默认持久性单元(PU)。有时类路径在部署时真的很混乱,我真的很想看到给定 EntityManagerFactory 的当前 PU 的名称。有没有办法做到这一点?另外,我很想看看 EntityManagerFactory 的整个属性映射。
【问题讨论】:
我注意到调用createEntityManagerFactory(null) 将使用配置文件中的默认持久性单元(PU)。有时类路径在部署时真的很混乱,我真的很想看到给定 EntityManagerFactory 的当前 PU 的名称。有没有办法做到这一点?另外,我很想看看 EntityManagerFactory 的整个属性映射。
【问题讨论】:
如果提供程序处于休眠状态,我找到了一种方法:
Session s=(Session)em.getDelegate();
//Get the URL.
String info=null;
try {
//The wonderful Hibernate team deprecated connection() before giving an alternative.
//Feel free to share the love at http://opensource.atlassian.com/projects/hibernate/browse/HHH-2603
//cf http://opensource.atlassian.com/projects/hibernate/browse/HHH-2603?focusedCommentId=29531&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_29531
info=s.connection().getMetaData().getURL();
} catch (Exception e) {
throw new RuntimeException(e);
}
//Finish
em.close();
return info;
请注意,em 是从 EntityManagerFactory 创建的已打开 EntityManager。还有,像cmets?没错,Hibernate 团队又充满了惊喜。尽管用户给出的反馈请求不要弃用唯一可以帮助我的方法,但他们仍在全力以赴。注意this link。
对于更稳定的 JPA 提供程序,我会提出任何好的建议。 Hibernate 太不稳定了。这绝对不是我必须解决的第一个此类问题。
【讨论】:
简的回答的问题是这样的:
会话 s=(Session)em.getDelegate();
在 J2EE api 之后,EntityManager.getDelegate() 方法:返回 EntityManager 的底层提供程序对象(如果可用)。此方法的结果是特定于实现的。 unwrap 方法是新应用程序的首选。
由于返回的对象是特定于实现的,因此它可能会有所不同,因此没有可靠的对象或属性可以从中获取持久性单元的名称。
我建议另一种简单的方法。就像在persistence.xml 的persistence-units 中添加一个自定义属性一样简单,其名称如下例所示:
<persistence-unit name="PERSISTENCE_UNIT" transaction-type="JTA">
<jta-data-source>DATASOURCE</jta-data-source>
<class>com.package.EntityClass</class>
<properties>
<property name="PERSISTENCE_UNIT_NAME" value="THE NAME OF MY PERSISTENCE UNIT"/>
</properties>
</persistence-unit>
</persistence>
在你的 java 代码中:
Map<String, Object> propertiesMap = entityManagerInstance.getProperties();
String persistenceUnitName = (String)propertiesMap.get("PERSISTENCE_UNIT_NAME");
EntityManager 的 getProperties() 方法是一种可靠的方法,而不是特定于供应商的方法,因此如果您在您的 persistence.xml 中使用您的持久性单元的名称设置自定义属性,您稍后将能够在您的 java 代码中轻松恢复它。
【讨论】: