Я изучаю, как интегрировать 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
Хорошо, это работает, но есть что-то, что я не понимая: Кроме того, в моем коде я опером новый сеанс вызова метода() на SessionFactory объекта openSession ... единственное что я не делал, было возвращено в блок попыток ... почему теперь это работает и до того нет? Tnx – AndreaNobili
Как я уже сказал, вы вызвали 'getCurrentSession()' это не сработает. У вас нет контекста сеанса. Пожалуйста, прочитайте [javadoc] (http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/SessionFactory.html#getCurrentSession()) –