JPA + Glassfish = IllegalStateException

5 respostas
Z111

Estou implementando o exemplo do livro JSF 2.0 Complete Reference e a praga do Glassfish está me retornando a seguinte mensagem na hora de executar qualquer tarefa do JPA.

INFO: mensagem: ------------------->true - true - java.lang.IllegalStateException: 
Exception Description: Cannot use an EntityTransaction while using JTA.

Pesquisando eu descobri que o problema seria com a transaction-type (JTA) rodando no Glassfish, porém não achei detalhes do erro, tampouco como solucionar…

No tomcat funciona bem, porém preciso que rode no Glassfish. O que está errado?

meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="w3bPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>myLocal</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

5 Respostas

E

Bota o stackTrace completo do erro.

Z111

foi só isso que o glassfish informou :frowning:

G

Quando você usa JTA quem manda na transação é o container, e não você. Não sei como está seu código, mas provavelmente você esteja tentando fazer algum commit manual parecido com isso:

public class Foo {
    @PersistenceContext
    private EntityManager em;

    public void doAnything() {
        EntityTransaction tx = em.getTransaction().
        ...
        tx.commit();
    }
}

Quando você usa JTA não é possível controlar manualmente a transação, já que o JTA deve fazer isso.

Andre_Brito
garcia-jj:
Quando você usa JTA quem manda na transação é o container, e não você. Não sei como está seu código, mas provavelmente você esteja tentando fazer algum commit manual parecido com isso:
public class Foo {
    @PersistenceContext
    private EntityManager em;

    public void doAnything() {
        EntityTransaction tx = em.getTransaction().
        ...
        tx.commit();
    }
}

Quando você usa JTA a asdasdnão é possível controlar manualmente a transação, já que o JTA deve fazer isso.


garcia-jj, acho que faltou você complementar:
Quando você usa JTA não é possível controlar manualmente a transação, a não ser que você defina que o bean deve controlar as transações (nesse caso, eu sempre usei a UserTransaction), através da annotation @TransactionManagement, setando o value pra bean.

Se você usar JTA e não especificar em lugar algum que você quer controlar as transações (deixar que o seu bean controle), o conteiner é quem vai controlar tudo (como o garcia-jj falou).

G

André, isso mesmo. Muito obrigado pela correção.

:thumbup:

Criado 20 de julho de 2010
Ultima resposta 20 de jul. de 2010
Respostas 5
Participantes 4