2013-03-16 2 views
1

Я разрабатываю веб-приложение, и я должен использовать JTA, который я никогда не использовал. Я начал использовать EntityManager, но, похоже, он не работает. Когда я использую EntityManager я получаю сообщение:ResourceLocal to JTA

Only persistence units with transaction type JTA can be used as a container managed entity manager. 

Короче, у меня есть этот кусок кода:

@PersistenceContext(unitName = "zJSF2PU") 
private EntityManager em; 
em.getTransaction().begin(); 
//some code 
em.getTransaction().commit(); 

Как я могу сделать это без EntityManager?

+0

Вы все еще используете сущности-менеджеры даже для CMT. Какую версию JPA вы используете? – Perception

+0

eclipse-link, но я тоже использовал Hibernate, и это было то же самое –

+0

Нет, не провайдер. Используете ли вы JPA 1 или 2? – Perception

ответ

1

Я, наконец, смог исправить свою проблему. Из моих поисков было показано, что вы не можете использовать EntityManager, если вы используете JTA в ManagedBeans, например. Однако он может использоваться в факторе без состояния, а затем мы можем вводить этот Faceless Bean в ManagedBean и использовать его методы. Процедура выглядит следующим образом:

  • создать EJB (простой класс с @Stateless аннотацией)

  • перемещения метод, который использует EntityManager к EJB

  • впрыскивать EJB в управляемой фасоль (с использованием @EJB аннотации) и вызывать соответствующий метод

для получения дополнительной информации обратитесь к этому другому сообщению: JTA & MySQL

0

В вашем EJB проекта META-INF/persistence.xml вы должны иметь что-то вроде:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence> 
    <persistence-unit name="myPersistenceUnitNamePersonalised" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/MySQL</jta-data-source> 
     <properties> 
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> 
      <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
     <property name="eclipselink.logging.level" value="FINE" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

И вы должны указать это в Application Server (JBoss, Tomcat, GlassFish)

Вам нужно искать, как добавить данные -source и единицы сохранения в вашем Application Server ...

и вот это ... они общаются через JNDI

+0

да У меня есть это, но это не помогает мне с моим кодом, который я разместил здесь –

+0

или лучше, как он может помочь? –

+0

хорошо .. Я определил транзакцию JTA ... Я только что рассказал вам, как добавить блок сохранения, такой как 'zJSF2PU', но JTA :) – Alex

0
  1. Удалить transaction-type="RESOURCE_LOCAL" с вашего persistence.xml.

  2. Удалить вызовов em.getTransaction(). Inject javax.transaction.UserTransaction (JTA) и используйте методы begin/commit/rollback. В качестве альтернативы, вместо этого введите EM в EJB без сохранения состояния и разрешите контейнеру EJB автоматически управлять транзакцией.

+0

Все, что вы сказали, я думаю, это правда, но мне нужно знать, как это сделать, поэтому я представил часть кода, поэтому, если вы знаете, как это сделать, вы можете помочь мне с обновленным кодом? Спасибо за ваш ответ. –

+0

С другой стороны, я пробовал использовать E-GAME без состояния, но это то же самое. –

+0

Извините, это казалось неправильным пониманием на концептуальном уровне, а не на уровне кода. Рад, что ты это понял. –