2013-02-23 3 views
3

Я изучаю, как интегрировать Spring Framework с Hibernate, чтобы создать свой DAO объектПроблем применения Spring + Hibernate: org.hibernate.HibernateException: Нет сеансы поиск по текущей теме

У меня есть некоторые проблемы, совершающая операцию чтения из CRUD рабочий комплект.

У меня есть этот класс, реализовать мой DAO объект:

package org.andrea.myexample.HibernateOnSpring.dao; 

import org.andrea.myexample.HibernateOnSpring.entity.Person; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.transaction.annotation.Transactional; 

public class PersonDAOImpl implements PersonDAO{ 

private SessionFactory sessionFactory; 

public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 

// Metodo che inserisce un nuovo record nella tabella person 
@Transactional(readOnly=false) 
public void addPerson(Person p) { 
    Session session = sessionFactory.openSession(); 
    session.save(p); 
    session.close();   
} 

/* Metodo che recupera un record, rappresentante uno studente, avente uno 
* specifico id dalla tabella. 
* 
* @param L'id dello studente 
* @see org.andrea.myexample.myJdbcSpringExample.StudentDAO#getStudent(java.lang.Integer) 
*/ 
public Person getById(int id){ 
    Session session = sessionFactory.openSession(); 
    return (Person) sessionFactory.getCurrentSession().get(Person.class, id); 
} 

} 

И у меня есть следующий основной класс, который используется объявление класса tesing:

package org.andrea.myexample.HibernateOnSpring; 

import org.andrea.myexample.HibernateOnSpring.dao.PersonDAO; 
import org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl; 
import org.andrea.myexample.HibernateOnSpring.entity.Person; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class App { 

public static void main(String[] args){ 

    ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 
    System.out.println("Contesto recuperato: " + context); 

    Person persona1 = new Person(); 

    persona1.setFirstname("Pippo"); 
    persona1.setLastname("Blabla"); 
    //persona1.setPid(1); 

    System.out.println("Creato persona1: " + persona1); 

    PersonDAO dao = (PersonDAO) context.getBean("personDAOImpl"); 

    System.out.println("Creato dao object: " + dao); 

    dao.addPerson(persona1); 

    System.out.println("persona1 salvata nel database"); 

    Person personaEstratta = dao.getById(persona1.getPid()); 

    System.out.println("Persona con id: " + personaEstratta.getPid() + " estratta dal DB"); 
    System.out.println("Dati persona estratta:"); 
    System.out.println("Nome: " + personaEstratta.getFirstname()); 
    System.out.println("Cognome: " + personaEstratta.getLastname()); 

} 
} 

Этот класс тестирование первых вставить новую запись в моей таблице базы данных и нормально ... эта работа хорошо (новая строка правильно вставлена ​​в таблицу)

Попробуйте извлечь строку с определенным идентификатором. Здесь у меня возникли некоторые проблемы, потому что при попытке получить объект бросает следующее исключение:

Contesto recuperato: org[email protected]11ba3c1f: startup date [Sat Feb 23 19:07:42 CET 2013]; root of context hierarchy 
Creato persona1: [email protected] 
Creato dao object: [email protected]4 
persona1 salvata nel database 
** 
Exception in thread "main" org.hibernate.HibernateException: No Session found for current thread 
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978) 
    at org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl.getById(PersonDAOImpl.java:31) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198) 
    at sun.proxy.$Proxy11.getById(Unknown Source) 
    at org.andrea.myexample.HibernateOnSpring.App.main(App.java:33)** 

Что проблема? Является ли это моей стратегией, чтобы получить объект правильно?

Tnx

Andrea

ответ

5

Ваша проблема здесь:

public Person getById(int id){ 
    Session session = sessionFactory.openSession(); 
    return (Person) sessionFactory.getCurrentSession().get(Person.class, id); 
} 

getCurrentSession() Метод возвращает сеанс, связанный с текущим контекстом. Вы не можете использовать этот метод в своей настройке, вам нужно использовать openSession(), как в вашем методе addPerson. Так что вам нужно сделать:

public Person getById(int id){ 
    Session session = sessionFactory.openSession(); 
    try { 
     return (Person) session.get(Person.class, id); 
    } finally { 
     session.close(); 
    }  
} 
+0

Хорошо, это работает, но есть что-то, что я не понимая: Кроме того, в моем коде я опером новый сеанс вызова метода() на SessionFactory объекта openSession ... единственное что я не делал, было возвращено в блок попыток ... почему теперь это работает и до того нет? Tnx – AndreaNobili

+1

Как я уже сказал, вы вызвали 'getCurrentSession()' это не сработает. У вас нет контекста сеанса. Пожалуйста, прочитайте [javadoc] (http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/SessionFactory.html#getCurrentSession()) –

Смежные вопросы