Проблема с ответом Яна заключается в следующем:
Сессия 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.