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代码中轻松恢复该属性