Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在查找当前EntityManagerFactory的当前持久性单元_Java_Jpa - Fatal编程技术网

Java 正在查找当前EntityManagerFactory的当前持久性单元

Java 正在查找当前EntityManagerFactory的当前持久性单元,java,jpa,Java,Jpa,我注意到调用createEntityManagerFactory(null)将使用配置文件中的默认持久化单元(PU)。有时,类路径在部署时会变得非常混乱,我非常希望看到给定EntityManagerFactory的当前PU的名称。有没有办法做到这一点?此外,我还想查看EntityManagerFactory的整个属性映射。如果提供程序是hibernate,我找到了一种方法: Session s=(Session)em.getDelegate(); //Get the URL. String

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

如果提供程序是hibernate,我找到了一种方法:


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
是从EntityManager工厂创建的打开的EntityManager。还有,喜欢这些评论吗?没错,Hibernate团队再次充满了惊喜。尽管用户给出了反馈,恳求不要反对唯一能帮助我的方法,但他们还是全力以赴。注意


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

简回答的问题是:

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

遵循J2EE api,EntityManager.getDelegate()方法:返回EntityManager的底层提供程序对象(如果可用)。此方法的结果是特定于实现的。对于新的应用,最好使用展开方法。

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

我建议另一种简单的方法。添加到persistence.xml的persistence中非常简单,它使用一个自定义属性的名称,如下例所示:

<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>

数据源
com.package.EntityClass
在java代码中:

Map<String, Object> propertiesMap = entityManagerInstance.getProperties();

String persistenceUnitName = (String)propertiesMap.get("PERSISTENCE_UNIT_NAME");
MapPropertiesMap=entityManagerInstance.getProperties();
String persistenceUnitName=(String)propertiesMap.get(“PERSISTENCE\u UNIT\u NAME”);
EntityManager的getProperties()方法是一种可靠的方法,并且不是特定于供应商的,因此,如果在persistence.xml中使用持久性单元的名称设置自定义属性,则以后可以在java代码中轻松恢复该属性