GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Javax.persistence.TransactionRequiredException: no transaction is in progress

Galera, dei uma pesquisada aki no forum e não encontrei nenhuma solução para o problema. Quando persisto um objeto com EntityManager tenho essa Excessão.

Alguém poderia me ajudar?

Minha entidade:

[code]@Entity
public class Cliente {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String nome;
private Integer idade;
private String endereco;
private String cpf;
private String telefone;

    // getters and setters	

}[/code]

Meu SessionBean:

[code]@Stateless
public class TesteBean implements Local{

@PersistenceContext(unitName="unidade")
private EntityManager entityManager;

@Override
public void insereCliente(Cliente cliente) {
	try {

		entityManager.persist(cliente);

	} catch (Exception e) {
		System.out.println(e.toString());
	}
	
	
}

}[/code]

Meu persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.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_1_0.xsd"> <persistence-unit name="unidade" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <non-jta-data-source>java:jdbc/MySqlDS</non-jta-data-source> <properties> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/teste"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="0715580"/> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.show_sql" value="true"/> </properties> </persistence-unit> </persistence>

Após o trecho de código:

Adicionei o flush:

porém sem sucesso!!

Alguém pode me ajudar??

Após o trecho de código:

Adicionei o flush:

porém sem sucesso!!

Alguém pode me ajudar??

Seu problema pode estar aqui:

transaction-type="RESOURCE_LOCAL"

Já tentou alterar para JTA(Transações gerenciadas pelo container) ?

transaction-type="JTA"

Se eu alterar para:

tenho a seguinte excessão

Veja como está o mysql-ds.xml:

<datasources> <local-tx-datasource> <jndi-name>jdbc/MySqlDS</jndi-name> <connection-url>jdbc:mysql://localhost:3306/teste</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>0715580</user-name> <password>0715580</password> </local-tx-datasource> </datasources>

Galera, resolvi o problema!!

No persistence.xml alterei a seguinte linha de:

para:

Agora está persistindo normalmente!!

Alguém pode me explicar??

A primeira utilizará um DS com transações gerenciadas pela aplicação(RESOURCE_LOCAL), por isso você precisaria de um EntityTransaction para demarcar as transações(lembrando que qualquer método que não seja de consulta do Entity Manager exige que você esteja dentro de uma transação, por isso ocorreu seu erro inicial)…

Já a segunda as transações serão gerenciadas pelo container(JTA) automaticamente, sem precisar demarcar(Você pode customizar com os atributos de transação mas não é requerido…)…

Obrigado!!

Comigo esta acontecendo o mesmo mas não sei o que pode ser:

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
    <persistence-unit name="Teste" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/Teste</jta-data-source>
	    <properties>
	        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
	        <property name="hibernate.show_sql" value="true"/>
	        <property name="hibernate.format_sql" value="true"/>
	    </properties>
    </persistence-unit>
</persistence>

E eu crier uma Servlet que grava dados em uma tabela

public class TestServlet extends HttpServlet {
    @PersistenceUnit
    private EntityManagerFactory emf;

    private void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException{
            EntityManager em = emf.createEntityManager();
            Usuario usuario = new Usuario("Jose");
            em.persist(entity);
            em.flush();
    }

e eu recebo a reguinte exception

javax.persistence.TransactionRequiredException: no transaction is in progress
	at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:419)

Alguem pode me ajudar?

Resolvi… A quem possa interessar ai vai o link da solução:
http://weblogs.java.net/blog/2005/12/05/entitymanagerpersist-throws-transactionrequiredexception-servlet

Desculpe a minha ignorância, mas você poderia me dizer o porque de você criar um EntityManager, sendo que você usa JTA? Por que não usa @PersistenceContext com o EntityManager direto?

http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis_1.html

Auf Wiedersehen!!!