2013-12-17 3 views
0

У меня есть приложение JEE. Классы этого приложения JEE упаковываются в два разных банка, которые являются членами EAR-файла.eclipselink: Отсутствует транзакция с разными банками

Предположим, у меня есть сущность JPA «DataEntity» (упакованная в банку «a.jar»).

В первом JAR файл "a.jar" также хранится следующий класс:

@Stateless 
@LocalBean 
public class A_Bean { 
    @PersistenceContext(unitName = "testApp") 
    private EntityManager em; 

    public void testMethod(DataEntity obj) { 
    if (em.contains(obj) log.info("CONTAINED a 1"); 
    else { 
     obj = em.merge(obj); 
     em.refresh(obj); 
    } 
    if (em.contains(obj) log.info("CONTAINED a 2"); 
    } 
} 

Во втором JAR файл "b.jar" У меня есть следующий класс:

@Stateless 
@LocalBean 
public class B_Bean { 
    @PersistenceContext(unitName = "testApp") 
    private EntityManager em; 

    public void testMethod(DataEntity obj) { 
    if (em.contains(obj) log.info("CONTAINED b 1"); 
    else { 
     obj = em.merge(obj); 
     em.refresh(obj); 
    } 
    if (em.contains(obj) log.info("CONTAINED b 2"); 
    } 
} 

сейчас Я предполагаю, что вызовы будут вызываться извне контейнера EJB (означает, что указанный DataEntity «dataObj» в настоящее время не управляется EntityManager):

a.testMethod(dataObj); 

показывает ожидаемый результат:

CONTAINED a 2 

Но если я называю

b.testMethod(dataObj); 

Я получаю

Exception: javax.persistence.TransactionRequiredException 
    at org.jboss.as.jpa.container.AbstractEntityManager.transactionIsRequired(AbstractEntityManager.java:692) 
    at org.jboss.as.jpa.container.AbstractEntityManager.merge(AbstractEntityManager.java:547) 
    at B_Bean.testMethod(B_Bean.java:xxx) 
    ... 

добавления Также

@TransactionAttribute(TransactionAttributeType.REQUIRED) 

не помогает.

И теперь, после перемещения класса B_Bean в файл a.jar, класс B_Bean работает так, как ожидалось.

Должен быть упакован весь EntityBeans в тот же файл jar? Есть ли уловка, как упаковывать классы Entity в разные файлы jar?

Моя среда:

  • JBoss 7.1.1
  • EclipseLink 2.5.1

Спасибо, Штеффен

+0

где вы упакована файл persistence.xml? –

+0

@Gabriel: В «a.jar». Это то, почему он работает, если A.class находится в a.jar? – Steffen

ответ

0

Есть трюк, как упаковать классы сущностей в разных файлах jar?

JPA specification определяет несколько областей непрерывности.

8.2.2 Persistence Unit Область EJB-компонент-JAR, WAR, клиентское приложение банку, или EAR можно определить единицы сохранения.

В вашем случае файл persistence.xml, упакованный в файл a.jar, определяет блок непрерывности, содержащий только компоненты, определенные этой банкой.

упорства единица, которая определяется на уровне с EJB-JAR, WAR, или клиент банки приложений является области действия к этому EJB-JAR, WAR, или прикладной банке, соответственно, и виден компонентам определенных в этой банке или войне.

У вас есть несколько возможностей расширить сферу вашего устройства. Например определить блок сохранения на уровне EAR:

настойчивости единица, которая определяется на уровне EAR, как правило, доступен для всех компонентов в приложении ...

Другая возможность заключается в том для изменения persistence.xml, включенного в a.jar, и явно включить ссылку на b.jar.

один или несколько файлов JAR может быть указан с помощью банка-файлов элементов вместо или в дополнение к отображения файлов, указанных в картирование-файлов элементов. Если указано, эти файлы JAR будут искать для управляемых классов персистентности ... Такие файлы JAR указываются относительно каталога или файла jar, который содержит корень единицы измерения persis- .

<jar-file>b.jar</jar-file> 
+0

Спасибо, но это не помогает. В это время мы меняем нашу архитектуру, чтобы у нас были все EJB и все Entity Beans в одной банке. – Steffen

Смежные вопросы