Sessão no Hibernate

Bom dia pessoal.

Estou desenvolvendo uma aplicação web no hibernate e fiquei com algumas dúvidas.
Estou usando um factory para buscar a sessão de dados, porém:

Ao entrar no sistema pelo navegador, e alterar um objeto da sessão sem persistir ele (comitar a sessão), se eu abrir outro navegador com outro usuário os dados já aparecem alterados para o outro usuário.
Eu imagino que o factory da sessão esteja retornando a mesma sessão sempre.
Pergunta: Como resolver isto? Qual melhor maneira?

Abaixo arquivo de config do hibernate:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/erp</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
		<property name="hibernate.query.substitutions">true=1, false=0</property>
                ...		
	</session-factory>
</hibernate-configuration>

Abaixo a classe que retorna a sessão:

public class HibernateUtil {

	private static SessionFactory factory;

	private static AnnotationConfiguration cfg;

	private static Session session;

	static {
		cfg = new AnnotationConfiguration();
		cfg.configure();

		factory = cfg.buildSessionFactory();
	}

	public static Session getSession() {
		if (session == null) {
			session = factory.openSession();
		}

		return session;
	}

	public static SessionFactory getSessionFactory() {
		return factory;
	}

}

Obrigado des de já!

A sua Session está estática, por isso está usando a mesma toda hora. A SessionFactory você pode deixar estática, mas a Session deve ser criada e controlada durante o uso. Um exemplo:

[code]public class HibernateUtil {

private static SessionFactory factory;

static {
	AnnotationConfiguration cfg = new AnnotationConfiguration();
	cfg.configure();
	factory = cfg.buildSessionFactory();
}

public static Session getSession() {
	return factory.openSession();
}

}[/code]

Certo, não tinha nem percebido isto.
Agora me deu um erro dizendo que o objeto ja estava sendo utilizado em outra sessão aberta.
Qual o procedimento correto que devo utilizar? Por exemplo, salvando em um CRUD, eu abro a sessão, salvo, comito e fecho a sessão (vide abaixo)…

Session session = HibernateUtil.getSession();
session.beginTransaction();
session.saveOrUpdate(vo);
session.getTransaction().commit();
session.close();
getWindow().showNotification("Registro salvo.");

Obrigado!

Sim, a princípio é isso mesmo! :smiley:

Na verdade ainda tenho algumas duvidas quanto as melhores praticas…
Por exemplo, agora esta dando um erro dizendo que não consegue inicializar o proxy ao acessar o atributo de um objeto que foi carregado pela sessão ja fechada… vide codigo…

	public void tableItemClick(ItemClickEvent event) {
		if (event.getItemId() != null) {
			Object vo = null;
			try {
				Session session = HibernateUtil.getSession();
				vo = session.load(voType, (Long) event.getItemId());
				session.close();
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
			if (vo != null) {
				try {
					BaseCrudWindow crud = (BaseCrudWindow) crudWindowType.newInstance();
					crud.setVo(vo);
					crud.votoform(vo);
					crud.setOpener(getWindow());
					getWindow().getParent().getWindow().addWindow(crud);
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}
	}

O erro ocorre na linha 15, quando a view vai acessar os atributos do objeto carregado da base.

Qual seria a melhor pratica?
Abrir uma sessão ao iniciar a tela e controlar a sessão ao fechar a tela?
Colocar o close() mais ao final do método?
Não utilizar o lazy?

Nesse caso, acho que o ideal é você utilizar o padrão Open Session in View. Alguns links que pode ser úties:

http://community.jboss.org/wiki/OpenSessioninView

Não trabalho com JSF, então não conheço as diferenças de implementação, mas a idéia é a mesma.

Flw! :thumbup: