Javax.persistence.TransactionRequiredException: no transaction is in progress

3 respostas
J

Ola pessoal estou com um problema muito estranho seguente:

o persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence">
	<persistence-unit name="JIMAGE" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>br.uninove.jimage.to.MetodosDeClassificacaoTO</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />

			<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jimage" />
			<property name="hibernate.connection.password" value="******" />
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.hbm2ddl.auto" value="update" />

			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />

			<property name="hibernate.transaction.auto_close_session" value="true" />
			<property name="hibernate.transaction.flush_before_completion" value="true" />
		</properties>
	</persistence-unit>
</persistence>
classe MetodosDeClassificaoTO.java
@Entity
@Table(name = "METODOS_DE_CLASSIFICAO")
@NamedQueries({
    @NamedQuery(name = "MetodosDeClassificacaoTO.findAll", query = "SELECT m FROM MetodosDeClassificacaoTO m"),
    @NamedQuery(name = "MetodosDeClassificacaoTO.findById", query = "SELECT m FROM MetodosDeClassificacaoTO m WHERE m.id = :id"),
    @NamedQuery(name = "MetodosDeClassificacaoTO.findByNome", query = "SELECT m FROM MetodosDeClassificacaoTO m WHERE m.nome = :nome")})
public class MetodosDeClassificacaoTO implements Serializable {

	
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @Basic(optional = false)
    @Column(name = "NOME")
    private String nome;

gets sets...
ai estou tentando fazer o seguinte.. na minha classe dao...
package br.uninove.jimage.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import br.uninove.jimage.to.MetodosDeClassificacaoTO;

public class JImageDao {

	private EntityManager em;
	
	public JImageDao(){
		if ( em == null ) {
			EntityManagerFactory emf = Persistence.createEntityManagerFactory("JIMAGE");
			em = emf.createEntityManager();
		}
	}
	....
	
	public void saveMetodosDeClassificacao(MetodosDeClassificacaoTO to){
		em.persist(to);  
		em.flush();
	}
	
	
	public static void main(String[] args) {
		JImageDao dao = new JImageDao();

		MetodosDeClassificacaoTO to1 = new MetodosDeClassificacaoTO();
		MetodosDeClassificacaoTO to2 = new MetodosDeClassificacaoTO();
		MetodosDeClassificacaoTO to3 = new MetodosDeClassificacaoTO();
		MetodosDeClassificacaoTO to4 = new MetodosDeClassificacaoTO();
		MetodosDeClassificacaoTO to5 = new MetodosDeClassificacaoTO();
		
		to1.setNome("Matriz de Co-ocorrência");
		to2.setNome("Matriz de Comprimento");
		to3.setNome("Matriz de Diferença de Níveis de Cinza");
		to4.setNome("Matriz de Soma e Diferença do Histograma");
		to5.setNome("Matriz do Momento do Histograma");
		
		dao.saveMetodosDeClassificacao(to1);
		dao.saveMetodosDeClassificacao(to2);
		dao.saveMetodosDeClassificacao(to3);
		dao.saveMetodosDeClassificacao(to4);
		dao.saveMetodosDeClassificacao(to5);
	}
}
que dar o error....
23:26:07,536 DEBUG QueryTranslatorImpl:239 - HQL: SELECT m FROM br.uninove.jimage.to.MetodosDeClassificacaoTO m WHERE m.nome = :nome
23:26:07,536 DEBUG QueryTranslatorImpl:240 - SQL: select metodosdec0_.ID as ID2_, metodosdec0_.NOME as NOME2_ from METODOS_DE_CLASSIFICAO metodosdec0_ where metodosdec0_.NOME=?
23:26:07,536 DEBUG ErrorCounter:91 - throwQueryException() : no errors
23:26:07,537 DEBUG SessionFactoryImpl:446 - Checking 0 named SQL queries
23:26:07,566 DEBUG SessionImpl:247 - opened session at timestamp: [telefone removido]
23:26:07,578 DEBUG AbstractSaveEventListener:330 - delaying identity-insert due to no transaction in progress
Exception in thread "main" javax.persistence.TransactionRequiredException: no transaction is in progress
	at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:301)
	at br.uninove.jimage.dao.JImageDao.saveMetodosDeClassificacao(JImageDao.java:33)
	at br.uninove.jimage.dao.JImageDao.main(JImageDao.java:53)

Alguém poderia me ajudar?

3 Respostas

A

jc.thalys,

Como voce esta trabalhando com tipo de transacao RESOURCE_LOCAL, voce necessitara em controlar transacao toda vez que executar DML no banco.

Em seus testes, tente abrir uma transacao. Ao final do processo, dispare o commit. Segue:

em.getTransaction().begin();

dao.saveMetodosDeClassificacao(to1);
dao.saveMetodosDeClassificacao(to2);
dao.saveMetodosDeClassificacao(to3);
dao.saveMetodosDeClassificacao(to4);
dao.saveMetodosDeClassificacao(to5);

em.getTransaction().commit();

Abracos

J
Ola, tentei
public void saveMetodosDeClassificacao(MetodosDeClassificacaoTO to){
		em.getTransaction().begin();
		em.persist(to);  
		em.flush();
		em.getTransaction().commit();
	}
so que na linha
em.getTransaction().begin();
ele da
22:15:15,061 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
22:15:15,065 DEBUG AbstractFlushingEventListener:134 - processing flush-time cascades
22:15:15,066 DEBUG AbstractFlushingEventListener:177 - dirty checking collections
22:15:15,067 DEBUG AbstractFlushingEventListener:108 - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
22:15:15,067 DEBUG AbstractFlushingEventListener:114 - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
22:15:15,068 DEBUG Printer:106 - listing entities:
22:15:15,069 DEBUG Printer:113 - br.uninove.jimage.to.MetodosDeClassificacaoTO{id=2, nome=Matriz de Co-ocorrência}
22:15:15,069 DEBUG JDBCTransaction:134 - commit
22:15:15,069 DEBUG AbstractFlushingEventListener:134 - processing flush-time cascades
22:15:15,069 DEBUG AbstractFlushingEventListener:177 - dirty checking collections
22:15:15,069 DEBUG AbstractFlushingEventListener:108 - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
22:15:15,069 DEBUG AbstractFlushingEventListener:114 - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
22:15:15,070 DEBUG Printer:106 - listing entities:
22:15:15,070 DEBUG Printer:113 - br.uninove.jimage.to.MetodosDeClassificacaoTO{id=2, nome=Matriz de Co-ocorrência}
22:15:15,070 DEBUG JDBCTransaction:227 - re-enabling autocommit
22:15:15,070 DEBUG JDBCTransaction:147 - committed JDBC Connection
22:15:15,071 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection
22:15:15,071 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
22:15:15,073 DEBUG AbstractEntityManagerImpl:406 - mark transaction for rollback
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.SessionException: Session is closed!
	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
	at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:41)
	at br.uninove.jimage.dao.JImageDao.saveMetodosDeClassificacao(JImageDao.java:31)
	at br.uninove.jimage.dao.JImageDao.main(JImageDao.java:56)
Caused by: org.hibernate.SessionException: Session is closed!
	at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
	at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1346)
	at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:38)
	... 2 more

alguem tem alguma dica?

J

deixando o begin e commit no em cada metodo funcionou…

só tirei as linhas do persistence.xml

<property name=“hibernate.transaction.auto_close_session” value=“true” />
<property name=“hibernate.transaction.flush_before_completion” value=“true” />

Criado 2 de maio de 2010
Ultima resposta 3 de mai. de 2010
Respostas 3
Participantes 2