Hibernate - Transações - Ninguem?

2 respostas
mInEiRo

Galera,

Uma dúvida
Qual a melhor forma de trabalhar com transações em hibernate.
Tenho uma alicação, estou usando Struts2 e Hibernate.

Preciso agora controlar a transação, pq vou precisar usar muito o FOR UPDATE (lock), assim preciso recuperar as transações.

eu tenho uma classe que trabalha com transações, ate peguei no tutorial do GUJ, HIbernate 3 avançado, é a classe abaixo.
Só que não esta recuperando corretamente a a transação. Tipo, eu bloqueio o registro, na hora que eu vou alterar, ele antes faz algumas consultas na base para validar algumas informações, dai ele começa a se perder todo, abre novas sesssion, e faz uma bagunça.
Quem puder me ajudar, eu agradeço

public class HibernateUtilDAO {
	private static final SessionFactory factory;
	private static final ThreadLocal<Session> sessionThread = new ThreadLocal<Session>();
	private static final ThreadLocal<Transaction> transactionThread = new ThreadLocal<Transaction>();
	
	static {
		try {
			factory = new Configuration().configure().buildSessionFactory();
		} catch (RuntimeException e) {
			e.printStackTrace();
			throw e;
		}
	}
	
	public static Session getSession() {
		if ( sessionThread.get() == null ) {
				Session session = factory.openSession();
				sessionThread.set( session );
		}
		return (Session) sessionThread.get();
	}
	
	public static void closeSession() {
		Session session = (Session) sessionThread.get();
		sessionThread.set(null);
		if ( session != null && session.isOpen() ) {
			session.close();
		}
		
	}
	
	public static void beginTransaction() {
		Transaction transaction = transactionThread.get();
		
		try {
			if (transaction == null) {
				transaction = getSession().beginTransaction();
				transactionThread.set(transaction);
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		}
		
		
//		Transaction transaction = getSession().beginTransaction();
	//	transactionThread.set(transaction);
	}
	
	public static void commitTransaction() {
		Transaction transaction = (Transaction) transactionThread.get();
		try {
			if (transaction != null && !transaction.wasCommitted()
					&& !transaction.wasRolledBack()) {
				transaction.commit();
				transactionThread.set(null);
			}
		} catch (Exception e) {
			rollbackTransaction();
			e.printStackTrace();
		}
	}
	
	
	public static void rollbackTransaction() {
		Transaction transaction = (Transaction) transactionThread.get();
		try {
			transactionThread.set(null);
			if (transaction != null && !transaction.wasCommitted()
					&& !transaction.wasRolledBack()) {
				transaction.rollback();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			closeSession();
		}
	}
}

2 Respostas

M

Mano tu conseguiu resolver esse pipino? Ou seja, trabalhar com lock pessimista(for update) de forma legal??

R

Da uma olhada nesses artigos.




Criado 28 de setembro de 2007
Ultima resposta 17 de abr. de 2008
Respostas 2
Participantes 3