Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Erro na JTA

javax.servlet.ServletException: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()

Surge esse erro ao tentar cadastrar livro

AdminLivrosBean.java

public class AdminLivrosBean {

    private Livro livro = new Livro();

    //Context and Dependency Injection
    @Inject
    private LivroDao dao;

    @Transactional
    public void salvar() {
        dao.salvar(livro);
        System.out.println("Livro cadastrado: " + livro);
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

}

LivroDao.java

public class LivroDao {

    @PersistenceContext
    private EntityManager manager;

    public void salvar(Livro livro) {
        manager.getTransaction().begin();
        manager.persist(livro);
        manager.getTransaction().commit();
    }

}
2 respostas
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.1" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
    http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="casadocodigo-dev" transaction-type="JTA">
        <description>Dev persistence unit</description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- java transaction api || JNDI (diretórios de nomes do java) -->
        <jta-data-source>java:jboss/datasources/casadocodigoDS</jta-data-source>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
        </properties>
    </persistence-unit>
</persistence>

Oi Leandro, tudo bem?

Como você está usando JTA, não precisa controlar a transação na mão, sendo assim, seu código ficará:

    public void salvar(Livro livro) {
        manager.persist(livro);
    }

Abraço!