【问题标题】:Finding the current persistence unit for the current EntityManagerFactory查找当前 EntityManagerFactory 的当前持久化单元
【发布时间】:2010-01-06 17:38:47
【问题描述】:

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

【问题讨论】:

    标签: java jpa


    【解决方案1】:

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

    
    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 太不稳定了。这绝对不是我必须解决的第一个此类问题。

    【讨论】:

      【解决方案2】:

      简的回答的问题是这样的:

      会话 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 代码中轻松恢复它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 2018-02-01
        • 1970-01-01
        • 2015-08-16
        相关资源
        最近更新 更多