[RESOLVIDO]Dados não alteram em tempo real - hibernate

13 respostas
D

To com o Seguinte problema… fiz um sisteminha
ta rodando blz

trabalho com o eclipse

o primeiro problema não tem nada a v com o topico… mas vo aproveita

quando copio o meu fonte do eclipse e passo pro netbeans… ele perde todas as configurações de acento ou letra como “ç”

alguem sab como arrumar isso

segundooo problema

eu passei pro netbeans… e criei um jar

blz…
mas quando eu coloco ele pra rodar em redeee

por exemplo coloco ele la no servidor

e abro o programa em um computador… e faço algumas alterações… dai no outro pc que o programa ta aberto… não aparece as alterações feitas pelo outro computador

sendo assim… que se eu foz dar baixa em uma parcela… em um computador… eu vou da baixa na mesma parcela no outro computadorr

to usando hibernate

alguem poderia ajudar… ou falar como posso arrumar isso

desde ja obrigado

13 Respostas

D

Bom partindo do pre-suposto obvio de que todos acessam a mesma base…
Você está usando o EntityManager pra fazer as inserções? Se não, ta fazendo de qual forma?
Já tentou dar um flush() depois que chamar o persist?

D

O ideal é você sempre usar transacões, pois o Transaction.commit() chama o Session.flush(), logo fica uma coisa a menos pra você se preocupar em por no código.

D

Minha Classe Dao ta assim oh

package dao;
/**
 * @author Eduardo
 */

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;

import util.HibernateUtil;

public abstract class Dao<E> {

	@SuppressWarnings("unchecked")
	private Class clazz;

	@SuppressWarnings("unchecked")
	public Dao(Class clazz){
		this.clazz = clazz;
	}
	public void cadastrar(E objeto) throws Exception {
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtil.getSession();
			transaction = session.beginTransaction();
			session.save(objeto);
			transaction.commit();
		} catch (Exception exe) {
			
			System.out.println(exe);
			
			if (transaction != null && !transaction.wasCommitted()
					&& !transaction.wasRolledBack()) {
				transaction.rollback();
			}
			throw exe;
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
	}

	public void alterar(E objeto) throws Exception {
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtil.getSession();
			transaction = session.beginTransaction();
			session.update(objeto);
			transaction.commit();
		} catch (Exception e) {
			if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
				transaction.rollback();
			}
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
	}

	public void excluir(E objeto) throws Exception {
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtil.getSession();
			transaction = session.beginTransaction();
			session.delete(objeto);
			transaction.commit();
		} catch (Exception e) {
			if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
				transaction.rollback();
			}
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
	}

	public void excluir(Integer i) throws Exception {
		excluir(carregarPorID(i));
	}

	@SuppressWarnings("unchecked")
	public E carregarPorID(Integer id) throws Exception {
		Session session = null;
		try {
			session = HibernateUtil.getSession();
			E result = (E) session.get(clazz, id);
			return result;
		} catch (Exception e) {
			throw e;
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
	}

	@SuppressWarnings("unchecked")
	public List<E> selecionarTodos() throws Exception {
		Session session = null;
		try{
			session = HibernateUtil.getSession();
			Criteria criteria = session.createCriteria(clazz);
			return criteria.list();
		}catch(Exception e){
			throw e;
		}finally{
			if(session != null && session.isOpen()){}
		      session.close(); 
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<E> selecionarTodossemcancel() throws Exception {
		Session session = null;
		try{
			session = HibernateUtil.getSession();
			Criteria criteria = session.createCriteria(clazz);
			criteria.add(org.hibernate.criterion.Expression.eq("cancelado", "N"));
			return criteria.list();
		}catch(Exception e){
			throw e;
		}finally{
			if(session != null && session.isOpen()){}
		      session.close(); 
		}
	}
	
	@SuppressWarnings("unchecked")
	public E selecionaPorDescricao(String descricao) throws Exception {
		Session session = null;
		try {
		
			session = HibernateUtil.getSession();
			Criteria criteriaCidade = session.createCriteria(clazz);
			criteriaCidade.add(org.hibernate.criterion.Expression.eq("descricao", descricao));
			
			E obj = (E) criteriaCidade.list().get(0);
			
			return obj;
		} catch (Exception e) {
			throw e;
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
	}
}

ond que eu devo arrumar?? desculpa a pouca experiencia minha!

D

o erro está na minha classe dao?

C

A princípio parece que o seu DAO está correto. Se a outra aplicação rodando na rede não está vendo as alterações, provavelmente deve ser porque ela já está com os dados em memória, que acabaram ficando defasados depois das alterações que você fez. Talvez se você fizer essa aplicação ler novamente da base de dados as informações, você obterá os dados atualizados.

Claro que estou assumindo que você está usando o mesmo banco de dados para ambas as aplicações.

E aproveitando, já que você utiliza o pattern de DAO pra separar o acesso aos dados (inclusive com o uso do generics para parametrizar a entidade do Hibernate), você podia dar um jeito neste monte de código repetido que você tem pra abrir a sessão, transação, fechar os recursos, etc. Acho que ia facilitar ainda mais pra você!

Abraço

D

HUm… Intendi…

Desculpa mas sou meio iniciante

mas da pra me ajuda… a fazer com que eu leia novamente os dados para atualizar os dados da aplicação

e como melhor minha classe DAO?

C

Uma abordagem é você colocar esse código que trabalha com a tua session num método e chamar este método de dentro dos seus métodos do DAO, pra evitar ficar colocando esses try/catch em tudo que é lugar.

Mas se você quiser práticas mais avançadas, você pode tentar usar o design pattern template method para abstrair todo o controle da session e da transação. Ou ainda usar o uma API como o CGLIB pra deixar isso bem transparente pra você (http://blog.tosin.com.br/cglib.pdf). Outro negócio legal pra sessions do Hibernate é usar o ThreadLocal pattern, que evitam que você abra a session mais de uma vez se você está chamando vários métodos em vários DAOs.

Enfim, as possibilidades são muitas. Acho que pra quem está aprendendo, como você mesmo mencionou, só o fato de você usar o DAO corretamente com o generics, você já está fazendo muito mais do que muita gente, pode acreditar. É só dar uma pequena lapidada que este código fica excelente.

Abraço

D

ahn… intendi…

Obrigado pela Ajuda!
e pela explicação que voce me deu?

só que a minha necessidade é grande em precisar que atualize os dados em tempo real no hibernate…

alguem da mais alguma dika ou ajuda!!

onde devo mecher para arrumar o erro?

D

Pesquisei bastante e achei algo sobre cache

mas no meu Dao nem no meu hibernateUtil… não tem nada de Cache… e vi tambem sobre fechar a sessão e abrir a sessão no DAO

mas isso o meu ta fazendooo

vixi

alguem sab resolver isso ai…

na hora que eu inicializo o meu sistema aparece isso

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly.

creio eu que isto inicializa as funções do hibernate

será que tem alguma coisa a ver

ajudem ai gente

desde ja obrigado!

D

Ainda to Precisando Pessoal

o meu hibernateUtil ta assim aonde cria a session

public static SessionFactory sessionFactory = null;

	public synchronized static Session getSession() throws Exception {
		return getSessionFactory().openSession();
	}

	public synchronized static SessionFactory getSessionFactory()
			throws Exception {
		if (sessionFactory == null) {
			sessionFactory = criarSessionFactory();
		}
		return sessionFactory;
	}
alguem da uma mão
G

Bom dia,

Passei pelo mesmo problema, se você estiver utilizando o MySQL o problema é que tanto o MySQL quanto o Hibernate ficam com cache, então uma solução é desabilitar o cache do MySQL modificando o arquivo my.ini e adicionando a seguinte linha de código abaixo da tag [mysqld]
transaction-isolation=READ-COMMITTED
Reinicie o MySQL e pronto =)

Espero ter ajudado.

[]'s,

C

Isto não tem nada a ver com problemas no Hibernate. Esta mensagem apenas indica que o Log4j (que é a API usada para log) não está devidamente configurado. O máximo que vai acontecer é o log não aparecer corretamente.

Pelo que você falou e pelo que eu entendi, o seu Hibernate está funcionando corretamente. Faça o teste. Depois de alterar alguma coisa no banco de dados, vá lá na tabela e veja se o dado está alterado lá. É bastante provável que esteja, já que você está lidando adequadamente com as transações e com a sessão no seu código. Acho que você está procurando o problema no lugar errado.

Depois de fazer a alteração, vá na sua outra aplicação que está na rede e mande reler os dados da base, chamando um desses métodos que você criou no seu DAO. Se você fizer isso você conseguirá enxergar os dados alterados pela outra aplicação (considerando que você tem uma base de dados só).

Imagine que você tem uma aplicação A e uma aplicação B e ambas carregam os registros de uma tabela do banco de dados. Estes registros carregados ficam em memória (e cada aplicação tem a sua memória). Quando você altera um dado usando a aplicação A, é claro que B não verá as modificações, porque você alterou o dado no banco de dados, mas na nemória B continua com os dados antigos. Pra resolver isso, B deve ler os dados do banco novamente para a sua memória, da mesma forma que os dados foram lidos a primeira vez.

Este cenário que eu descrevi parece ser exatamente o que você tem. Acho que você não tem problema no código e nem em lugar nenhum. É assim que as coisas funcionam. E enquanto você não implementar um mecanismo de “refresh” dos dados na aplicação, você vai continuar vendo dados antigos.

Abraço

D

Obrigado guimazzei e ctosin e danielfigueiredoc
Voces me ajudaram muito

e Realmente foi acrescentar a linha de comando

transaction-isolation=READ-COMMITTED no mysql

e atualiza instantaneamente em diferentes terminais!

Obrigado

Criado 18 de dezembro de 2009
Ultima resposta 22 de dez. de 2009
Respostas 13
Participantes 4