Поиск текущей единицы сохранения для текущего EntityManagerFactory

#java #jpa

#java #jpa

Вопрос:

Я заметил, что при вызове createEntityManagerFactory(null) будет использоваться единица сохранения по умолчанию (PU) в файле конфигурации. Иногда пути к классам действительно путаются при развертывании, и мне бы очень хотелось увидеть имя текущего PU для данного EntityManagerFactory. Есть ли какой-либо способ сделать это? Кроме того, я хотел бы зайти так далеко, чтобы увидеть всю карту свойств для EntityManagerFactory.

Ответ №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=29531amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_29531
 info=s.connection().getMetaData().getURL();
} catch (Exception e) {
 throw new RuntimeException(e);
}

//Finish
em.close();

return info;
  

Обратите внимание, что em это открытый EntityManager, созданный из EntityManagerFactory. Также, как комментарии? Верно, команда Hibernate снова полна сюрпризов. Несмотря на то, что пользователи оставляли отзывы, умоляя не отказываться от единственного метода, который может мне помочь, они идут полным ходом. Обратите внимание на эту ссылку.

Я поддержу любые хорошие предложения по более стабильному поставщику JPA. Режим гибернации становится слишком нестабильным. Это определенно не первая проблема такого рода, которую мне пришлось обойти.

Ответ №2:

Проблема с ответом Яна заключается в следующем:

Session s=(Сессия)em.getDelegate();

Следуя J2EE api, метод EntityManager.getDelegate() : Возвращает базовый объект поставщика для EntityManager, если он доступен. Результат этого метода зависит от реализации. Метод unwrap должен быть предпочтительным для новых приложений.

Из-за того, что возвращаемый объект зависит от конкретной реализации, он может отличаться, поэтому нет надежного объекта или атрибута, из которого берется имя единицы сохранения.

Я предлагаю другой простой способ получить. Это так же просто, как добавить в 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");
  

Метод GetProperties() EntityManager является надежным методом и не зависит от поставщика, поэтому, если вы задаете пользовательское свойство с именем вашего модуля сохранения в вашем persistence.xml позже вы сможете легко восстановить ее в своем java-коде.