java – Spring Hibernate应用程序中的问题:org.hibernate.HibernateException:找不到当前线程的Session
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring Hibernate应用程序中的问题:org.hibernate.HibernateException:找不到当前线程的Session,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4502字,纯文字阅读大概需要7分钟。
内容图文
![java – Spring Hibernate应用程序中的问题:org.hibernate.HibernateException:找不到当前线程的Session](/upload/InfoBanner/zyjiaocheng/722/1f0d50caa4ed4d4484f80bb8c42db359.jpg)
我正在研究如何将Spring Framework与Hibernate集成以创建我的DAO对象
我在从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);
}
}
我有以下用于广告测试类的主要类:
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());
}
}
这个测试类首先在我的数据库表中插入一条新记录,好吧……这个工作得很好(新行正确地插入到表中)
尝试提取具有特定ID的行.这里我遇到了一些问题,因为在尝试获取对象时会抛出以下异常:
Contesto recuperato: org.springframework.context.support.ClassPathXmlApplicationContext@11ba3c1f: startup date [Sat Feb 23 19:07:42 CET 2013]; root of context hierarchy
Creato persona1: org.andrea.myexample.HibernateOnSpring.entity.Person@777dcf23
Creato dao object: org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl@3f12ccc4
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
安德里亚
解决方法:
你的问题在这里:
public Person getById(int id){
Session session = sessionFactory.openSession();
return (Person) sessionFactory.getCurrentSession().get(Person.class, id);
}
方法getCurrentSession()返回绑定到当前上下文的会话.您无法在设置中使用此方法,您需要在addPerson方法中使用openSession().所以你需要这样做:
public Person getById(int id){
Session session = sessionFactory.openSession();
try {
return (Person) session.get(Person.class, id);
} finally {
session.close();
}
}
内容总结
以上是互联网集市为您收集整理的java – Spring Hibernate应用程序中的问题:org.hibernate.HibernateException:找不到当前线程的Session全部内容,希望文章能够帮你解决java – Spring Hibernate应用程序中的问题:org.hibernate.HibernateException:找不到当前线程的Session所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。