Estou utilizando o hibernate 3.2.6 e estou precisando pegar uma conexão atraves da Session só que o eclipse está me mostrando
que o metodo session.connection() está deprecated, como faço para recuperar um objeto connection no hibernate ?
Ainda não disponibilizaram uma alternativa. Será disponibilizado em futuras versões.
L
luciano_guedes_antun
como faço então para recuperar uma connection sigo utilizando o session.connection() ?
A
Amanweb
sim, até disponibilizarem uma solução alternativa
B
bruno_cobra
Estava com o mesmo problema e encontrei a solução.
Considerando que tenha acesso a um objeto Connection, na tua classe de conexão, basta criar um método acesse e retorne, desse objeto, o seguinte: buildSettings().getConnectionProvider().getConnection().
Exemplo: se tiveres um objeto Configuration com o nome cfg, basta fazer cfg.buildSettings().get[…].
Só para constar: o fato de um método ser depreciado não significa que seja impossível utilizá-lo…
J
jupysilva
Veja se este exemplo de HibernateUtil pode te ajudar
packagebr.com.azi.util.hibernate;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjavax.naming.Context;importjavax.naming.InitialContext;importjavax.naming.NamingException;importjavax.sql.DataSource;importorg.hibernate.Hibernate;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.AnnotationConfiguration;importorg.hibernate.cfg.Configuration;importbr.com.azi.util.xml.XmlFileReader;/** * Classe utilitária para gerenciamento do Hibernate, tem como objetivos: * <ul> * <li>Inicializar uma única instância da SessionFactory do Hibernate;</li> * <li>Abrir Sessions do Hibernate;</li> * <li>Associar Sessions a ThreadsLocais;</li> * <li>Fechar Sessions associadas.</li> * </ul> * O pacote de anotações para o Hibernate (Hibernate Annotations) requer uma classe * especial para a construção do SessionFactory. Por questões de compatibilidade com * aplicações que já utilizam a classe HibernateUtil, foi criado o método setSessionFactory() * que recebe como parâmetro um objeto da classe SessionFactory que substituirá o objeto criado * anteriormente dentro da classe. Desta maneira não alteramos a inicialização anterior da classe. * Utilize este método caso o projeto utilize Hibernate Annotations.<br/><br/> * <i>Atenção!</i> Uma exceção pode ser disparada no momento em que HibernateUtil for carregada na memória, * caso o arquivo de configuração do hibernate utilize a sintaxe permitida para o Hibernate Annotations. Se a * intenção for utilizar annotations no projeto para efetuar o mapeamento das classes, ignore a exceção e * utilize o método setSessionFactory() para atribuir um factory válido para a aplicação. */publicclassHibernateUtil{privatestaticSessionFactorysessionFactory;privatestaticConfigurationconfiguration;privatestaticbooleanannotationActive=false;privatestaticfinalThreadLocalthreadSession=newThreadLocal();publicstaticvoidinitialize(){try{sessionFactory=configuration.configure().buildSessionFactory();System.out.println(">> HIBERNATE INICIADO COM SUCESSO.");}catch(Throwablee){System.out.println(">> FALHA NA INICIAÇÃO DO HIBERNATE.");e.printStackTrace();}}publicstaticConfigurationgetConfiguration(){if(configuration==null)configuration=(annotationActive)?newAnnotationConfiguration():newConfiguration();returnconfiguration;}publicstaticvoidsetConfiguration(Configurationcfg){HibernateUtil.configuration=cfg;}publicstaticbooleanisAnnotationActive(){returnannotationActive;}publicstaticvoidsetAnnotationActive(booleanannotationActive){HibernateUtil.annotationActive=annotationActive;}publicstaticvoidreinitialize(){closeSession();initialize();getSession();}/** * Inicializa as propriedades de um objeto persistido. */publicstaticvoidinitializeProperties(Objectobj){if(!Hibernate.isInitialized(obj)){Hibernate.initialize(obj);}}/** * Atualiza um objeto persistido. */publicstaticvoidrefreshObject(Objectobj){Sessions=HibernateUtil.getSession();s.refresh(obj);}/** * Limpa a session corrente. */publicstaticvoidclearSession(){Sessions=HibernateUtil.getSession();s.clear();}/** * Retorna uma Session existente, ou então abre uma nova e associa a ThreadLocal. * @return uma sessão do Hibernate */publicstaticSessiongetSession(){if(sessionFactory==null){initialize();closeSession();}Sessions=(Session)threadSession.get();if(s==null){s=sessionFactory.openSession();threadSession.set(s);}returns;}/** * Fecha a Session associada a ThreadLocal. */publicstaticvoidcloseSession(){Sessions=(Session)threadSession.get();threadSession.set(null);if(s!=null&&s.isOpen()){s.close();}}/** * Retorna uma Connection JDBC independente. <br> OBS: É necessário chamar o método <tt>close()</tt> da conexão a fim de fecha-la. * Caso o arquivo hibernate.cfg.xml esteja configurado para utilizar um DataSource gerenciado pelo servidor de aplicativo, este * método irá fazer uso dele. Caso contrário, irá criar manualmente uma nova conexão JDBC com o servidor de banco de dados. * * @return uma Connection JDBC */publicstaticConnectiongetConnection(){/* * Abre o arquivo hibernate.cfg.xml para obter as configurações de acesso ao banco de dados. */XmlFileReaderxmlReader;try{xmlReader=newXmlFileReader(HibernateUtil.class.getResource("/hibernate.cfg.xml"));}catch(Exceptione){thrownewRuntimeException("Não foi possível abrir o arquivo /hibernate.cfg.xml para leitura.",e);}/* * Se a origem da conexão JDBC for um DataSource gerenciado pelo servidor de aplicativo, utiliza o nome JNDI do * mesmo para se obter e repassar a conexão. */StringjdbcDataSource=xmlReader.getNodeValue("//hibernate-configuration/session-factory/property[@name='connection.datasource']");if(jdbcDataSource!=null){try{Contextctx=newInitialContext();DataSourceds=(DataSource)ctx.lookup(jdbcDataSource);returnds.getConnection();}catch(NamingExceptione){thrownewRuntimeException("Não foi possível obter o objeto DataSource a partir do contexto JNDI.",e);}catch(SQLExceptione){thrownewRuntimeException("Não foi possível obter a conexão JDBC a partir do objeto DataSource.",e);}}/* * Lê as propriedades da conexão JDBC utilizadas pelo Hibernate. */StringdriverName=xmlReader.getNodeValue("//hibernate-configuration/session-factory/property[@name='connection.driver_class']");Stringurl=xmlReader.getNodeValue("//hibernate-configuration/session-factory/property[@name='connection.url']");Stringusername=xmlReader.getNodeValue("//hibernate-configuration/session-factory/property[@name='connection.username']");Stringpassword=xmlReader.getNodeValue("//hibernate-configuration/session-factory/property[@name='connection.password']");/* * Cria manualmente uma conexão JDBC com o servidor de banco de dados. */try{Class.forName(driverName);returnDriverManager.getConnection(url,username,password);}catch(ClassNotFoundExceptione){thrownewRuntimeException("A classe do driver de conexões JDBC não foi encontrada.",e);}catch(SQLExceptione){thrownewRuntimeException("Não foi possível obter manualmente uma conexão JDBC com o servidor de banco de dados.",e);}}}
S
saoj
Acho que o pessoal do Hibernate aprontou mais uma das boas.
Eu PRECISO pegar a conexão associada a SESSION porque essa conexão VEIO do POOL DE CONEXÕES que o Hibernate gerencia internamente.
Pegar essa conexão de qualquer outra maneia que não seja essa vai te obrigar a gerenciar um outro pool de conexões por fora do Hibernate, ou seja, vc termina com 2 pools de conexões rodando na sua aplicação.
E o mais importante: se a session já fez alterações numa connection dentro de uma transação, essas alterações estão disponíveis APENAS nessa connection até ela comitar, ou seja, qualquer outra coisa não vai servir.
CONCLUSÃO:
Precisamos de qualquer jeito obter a connection associada a session do hibernate, isto é, a que ele está usando para aquela sessão, e nenhuma outra.
Quem depreciou session.connection() é um maluco.
Ou apenas me diga como eu pego a connection da session sem usar session.connection() e eu reconsidero minha opinião.
E
Edufa
Estou com este problema, já q está previsto para cair fora na versão 4 do hibernate
alguém tem ideia de como pegar a connection? não encontro mais elas nas sugestões relacionadas, claro estou usando a ultima versão do hibernate e pelo jeito retiraram qualquer versão dele.
J
javaflex
Sei que quer a conexão, mas qual seu objetivo final com ela? Só para tentar ajudar sem talvez não precisar dela. No Hibernate do .NET não tem essa palhaçada de tentar esconder a conexão. Se for verdade mesmo que escondem a conexão, esses arquitetos do Hibernate do Java tem que parar de tratar como criança os desenvolvedores.
T
thyagopacher
O ireport utiliza a connection para gerar o relatório (eu utilizo java) também tem outros métodos de passar o resultset e o list, porém no meu caso passar a connection para o ireport seria mais confortável para mim…