Eu tenho 2 factories: uma pra HibernateSessionFactory e outra pra HibernateSession. Segue o código delas:
HibernateSession:
[code]@Component
public class HibernateSession implements ComponentFactory {
private SessionFactory factory;
private Session session;
public HibernateSession(SessionFactory factory) {
this.factory = factory;
}
@PostConstruct
public void construtor() {
this.session = factory.openSession();
}
public Session getInstance() {
return this.session;
}
@PreDestroy
public void destrutor() {
this.session.close();
}
}[/code]
HibernateSessionFactory:
[code]@Component
public class HibernateSessionFactory implements
ComponentFactory {
private SessionFactory factory;
@PostConstruct
public void construtor() {
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
ServiceRegistryBuilder settings = builder.applySettings(configuration
.getProperties());
ServiceRegistry serviceRegistry = settings.buildServiceRegistry();
this.factory = configuration.buildSessionFactory(serviceRegistry);
}
public SessionFactory getInstance() {
return this.factory;
}
@PreDestroy
public void destrutor() {
this.factory.close();
}
}[/code]
Além disso, eu tenho um interceptor com o objetivo de abrir e terminar a transação do hibernate:
[code]@Intercepts
public class HibernateInterceptor implements Interceptor {
private final Session session;
public HibernateInterceptor(Session session) {
this.session = session;
}
public boolean accepts(ResourceMethod method) {
return true;
}
public void intercept(InterceptorStack stack, ResourceMethod method,
Object instance) throws InterceptionException {
session.getTransaction().begin();
stack.next(method, instance);
session.getTransaction().commit();
}
}[/code]
Minha ideia é fazer o acesso ao banco de dados através de um DAO:
[code]@Component
public class Dao {
private final Session session;
public Dao(Session session) {
this.session = session;
}
public List getAll(String classe) {
Query query = session.createQuery("from " + classe);
return query.list();
}
}[/code]
Só que tem 2 problemas com esse código todo:
1- Apesar do meu controller só chamar o “getAll” do DAO 1 vez, ele está sendo executado 2 vezes, em momentos distintos.
2- O destrutor da HibernateSession não está sendo executado corretamente. Uma mensagem é disparada no console:
Alguém sabe o motivo e a solução desses problemas?
