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();
}
}
}