Como faço para abrir manualmente uma sessão de hibernação?

votos
2

Eu tenho um pouco grande primavera projeto envolvendo e hibernação. Agora, eu estou apoiando certos objetos para fora da hibernação e na memória, e eu bati uma espécie de obstáculo. Eu tenho a seguinte configuração.

Uma classe contém um número de primitivas e uma classe B. B contém as primitivas e uma classe C, a qual foi previamente preguiçoso-carregado .

Agora eu tenho esta

Chamada de serviço 1:
1.) criar objeto da classe A
2.) obter objeto da classe B
3.) Conjunto B em A
4.) Adicionar um para a memória

Chamada de serviço 2:
1.) Obter uma da memória
2.) obter B de A
3.) obter C de B
4.) operar em C

Porque C é preguiçoso carregado, ele contou com uma sessão de hibernação existente para carregar-se preguiçosamente de B com hibernate, pelo menos eu acredito que isso seja assim. Agora, porém, eu preciso carregar preguiçoso , sem modificar o DAO para devolver um ID, e não existe nenhuma corrente sessão de hibernação para seqüestrar para com OpenSessionInView. Qual é a melhor maneira de ir sobre como resolver este problema, dadas as limitações? As únicas soluções que eu encontrei dependem de alteração de código inadequados ou uma sessão existente, então eu acho que eu poderia, talvez, abrir manualmente uma sessão de hibernação. Como eu iria fazer isso? Como alternativa, há uma melhor solução para este problema?

Publicado 19/05/2009 em 19:53
fonte usuário
Em outras línguas...                            


5 respostas

votos
4

Como uma melhor prática, você vai querer usar uma fábrica de sessão. Aqui é o Netbeans gera.

public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    private static final Configuration configuration = new Configuration().configure();

    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Uma vez que você tem isso, você pode usar este código para uma transação

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
//Do something
session.getTransaction().commit();

Note-se que a abertura de uma transação irá abrir uma sessão. Eu acredito em Hibernar pura (ao contrário JPA) você precisa de uma transação para fazer qualquer coisa, até mesmo lê.

No final do programa que você quer ter a certeza que fazer isso

HibernateUtil.getSessionFactory().close();

Para uma solução mais sofisticada, você pode querer olhar para o gerenciamento automático de sessão / transação com Spring ou EJB. Que irá lidar com a sessão nos bastidores uma vez configurado corretamente.

EDIT:
Apenas re-ler sua pergunta e o seu ponto sobre IDs. Eu acredito que a abordagem SessionFactory irá trabalhar para os seus fins, a menos que você está fazendo um aplicativo de rosca múltipla. Isso ocorre porque, por padrão, o Hibernate sessões e os objetos ORM ligadas a essa sessão estão associados a apenas um segmento. Deixe-me saber se eu estou errado sobre isso.

Respondeu 19/05/2009 em 20:19
fonte usuário

votos
2

Se você pode obter uma referência ao seu SessionFactory configurado, você deve ser capaz de apenas chamar openSession () sobre ele.

Respondeu 19/05/2009 em 20:08
fonte usuário

votos
1

Se você sabe que seus objetos B pode ter do seu C referenciada, você deve recuperar os B na forma de pré-busca a C da. Por exemplo, o HQL

from B as b where b.id = :ID

torna-se

from B as b left join fetch b.c where b.id = :ID
Respondeu 20/05/2009 em 18:31
fonte usuário

votos
1

Você está usando HibernateTemplatee HibernateDaoSupportpara implementar suas DAOs? Se assim for, é por isso que os objetos estão desconectados. Mas, você deve ser capaz de usar o OpenSessionInViewInterceptornesse caso. Você fez alguma coisa para verificar que você não será capaz de usar o interceptor?

Além disso, se você optar por abrir um novo Session, o objeto na memória não será associado ao novo Session. Você vai precisar para recolocar o objeto da sessão para que o carregamento lento para trabalhar.

Respondeu 19/05/2009 em 20:45
fonte usuário

votos
-2

Basta usar Session session = new Configuration () configure () buildSessionFactory () getCurrentSession ()...; . Ou Session session = new Configuration () configure () buildSessionFactory () getOpenSession ()..;

Respondeu 10/01/2018 em 17:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more