查找当前EntityManagerFactory的当前持久性单元

时间:2010-01-06 17:38:47

标签: java jpa

我注意到调用createEntityManagerFactory(null)将在配置文件中使用默认的持久性单元(PU)。有时类路径在部署时变得非常混乱,我真的希望看到给定EntityManagerFactory的当前PU的名称。有没有办法做到这一点?此外,我希望能够看到EntityManagerFactory的整个属性映射。

2 个答案:

答案 0 :(得分:0)

如果提供者处于休眠状态,我找到了一种方法:


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。还有,像评论一样?没错,Hibernate团队再次充满惊喜。即使用户提出反馈意见,也不要弃用可以帮助我的唯一方法,但他们正在全力以赴。注意this link

我会为更稳定的JPA提供商提出任何好的建议。 Hibernate变得太不稳定了。这绝对不是我必须解决的第一个此类问题。

答案 1 :(得分:0)

Jan的答案是:

会话s =(会话)em.getDelegate();

遵循J2EE api,EntityManager.getDelegate()方法:返回EntityManager的基础提供程序对象(如果可用)。此方法的结果是特定于实现的。解包方法是新应用程序的首选方法。

由于返回的对象是特定于实现的,因此它可能会有所不同,因此没有可靠的对象或属性来自持久性单元的名称。

我提出另一个简单的方法。它就像添加到persistence.xml的持久性单元一样容易,它的一个自定义属性的名称如下例所示:

<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代码很容易。