Нахождение текущей единицы сохраняемости для текущего EntityManagerFactory - PullRequest
4 голосов
/ 06 января 2010

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

Ответы [ 2 ]

0 голосов
/ 17 июля 2014

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

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

После API J2EE метод 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");

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

0 голосов
/ 06 января 2010

Я нашел способ сделать это, если провайдер находится в спящем режиме:


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, созданный из EntityManagerFactory. Кроме того, как комментарии? Правильно, команда Hibernate снова полна сюрпризов. Несмотря на то, что пользователи давали обратную связь, прося не осуждать единственный метод, который может мне помочь, они идут полным ходом. Примечание эта ссылка .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...