Olá galera… vamos aos códigos!
Tenho usado esta classe auxiliar para o hibernate:
/*
* HibernateUtil.java
*
* Created on 9 de Agosto de 2006, 15:44
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package dao;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.hibernate.*;
import org.hibernate.cfg.*;
/**
*
* @author flavio
*/
public class HibernateUtil {
private static final SessionFactory factory;
private static final Configuration cfg;
private static final ThreadLocal sessionThread = new ThreadLocal();
private static final ThreadLocal transactionThread = new ThreadLocal();
private static String host = null;
private static String database = null;
private static String user = null;
private static String passwd = null;
private static Properties prop = new Properties();
static {
//Bloco estático que inicializa o Hibernate, escreve o stack trace se houver algum problema e relança a exceção
try {
carregarParametros();
cfg = new Configuration()
.addClass(bean.Cliente.class)
.addClass(bean.Evento.class)
.addClass(bean.Imagem.class)
.addClass(bean.Classificador.class)
.addClass(bean.Uf.class)
.addClass(bean.Produto.class)
.addClass(bean.Formato.class)
.addClass(bean.Pedido.class)
.addClass(bean.ItemPedidoImagem.class)
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.url", "jdbc:mysql://" + host + "/" + database + "?autoReconnect=true&jdbcCompliantTruncation=false")
.setProperty("hibernate.show_sql", "true")
.setProperty("hibernate.connection.username", user)
.setProperty("hibernate.connection.password", passwd)
.setProperty("hibernate.cache.use_query_cache", "false")
.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider")
.setProperty("hibernate.cache.use_second_level_cache", "false");
factory = cfg.buildSessionFactory();
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
}
public static void carregarParametros() {
try {
FileInputStream file = new FileInputStream(new File("config.ini"));
prop.load(file);
host = prop.getProperty("host");
database = prop.getProperty("database");
user = prop.getProperty("user");
passwd = prop.getProperty("passwd");
System.setProperty("path", prop.getProperty("path", "c:/photos/"));
System.setProperty("pathThumbs", prop.getProperty("pathThumbs", "c:/photos/thumbnails/"));
System.setProperty("pathPreviews", prop.getProperty("pathPreviews", "c:/photos/previews/"));
file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Session getSession() {
Session session = (Session) sessionThread.get();
if ( session == null || !session.isOpen() ) {
session = factory.openSession();
sessionThread.set( session );
}
return (Session) sessionThread.get();
}
public static void closeSession() {
Session session = (Session) sessionThread.get();
if ( session != null && session.isOpen() ) {
sessionThread.set(null);
session.close();
}
}
public static void beginTransaction() {
Transaction transaction = getSession().beginTransaction();
transactionThread.set(transaction);
}
public static void commitTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if ( transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack() ) {
transaction.commit();
transactionThread.set(null);
}
}
public static void rollbackTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if ( transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack() ) {
transaction.rollback();
transactionThread.set(null);
}
}
}
Tenho o seguinte DAO para clientes:
public class ClienteDAO {
public static void save(Cliente cliente) {
Session session = HibernateUtil.getSession();
HibernateUtil.beginTransaction();
session.save(cliente);
HibernateUtil.commitTransaction();
}
public static void update(Cliente cliente) {
Session session = HibernateUtil.getSession();
HibernateUtil.beginTransaction();
session.update(cliente);
HibernateUtil.commitTransaction();
HibernateUtil.closeSession();
}
public static void delete(Cliente cliente) {
Session session = HibernateUtil.getSession();
HibernateUtil.beginTransaction();
session.delete(cliente);
HibernateUtil.commitTransaction();
}
public static List<Cliente> list() {
List<Cliente> clientes;
Session session = HibernateUtil.getSession();
session.flush();
clientes = session.createQuery("from Cliente order by nome").list();
return clientes;
}
public static List<Cliente> list(String nome) {
List<Cliente> clientes;
Session session = HibernateUtil.getSession();
session.flush();
clientes = session.createQuery("from Cliente where nome like :nome order by nome").setString("nome", "%" + nome + "%").list();
return clientes;
}
public static List<Cliente> getByNome(String nome) {
List<Cliente> clientes;
Session session = HibernateUtil.getSession();
session.flush();
clientes = session.createQuery("from Cliente where nome = :nome order by nome").setString("nome", nome).list();
return clientes;
}
public static Cliente getById(Integer id) {
Session session = HibernateUtil.getSession();
return (Cliente)session.get(Cliente.class, id);
}
}
As linhas session.flush() acrescentei-as a pouco para testar, mas não funcionou… Creio que o hibernate esteja mantendo as instancias já lidas em cache o que faz com que novas leituras (ClienteDAO.list(), por exemplo) não apareçam na outra aplicação aberta. E isto ocorre mesmo se rodar duas instancias de aplicação na mesma máquina.
Já to pensando seriamente em fazer uma camada de acesso remoto como indicou o Guerr@, mas o problema é que sou iniciante em Java e sei que tomarei uma surra tremendar…
Ouço falar de RMI e outras coisas referentes a objetos remotos… Acho que a solução seria algo neste sentido (isto claro se minha solução atual não funcionar mesmo).
Obrigado a todos.