我到处都是网络,我很少迷路,无法解决我的问题。
我正在使用Eclipse创建一个Web应用程序,在客户端使用JSP,在服务器端使用Servet / Hibernate。 我正在尝试将一个Object传递给一个servlet的JSP页面。
在servlet中:
Contact c = dao.getContact(dataID);
request.setAttribute("data", c);
getServletContext()
.getRequestDispatcher("/"+url+"?id="+dataID).forward(request, response);
在JSP页面中:
Contact contact = (Contact)request.getAttribute("data");
联系人是一个ORM,其属性如“lastname”。
但我收到此错误消息:
GRAVE: "Servlet.service()" pour la servlet GetData a généré une exception
org.hibernate.HibernateException: No CurrentSessionContext configured!
at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:683)
at domain.DAOContact.getContact(DAOContact.java:39)
at domain.GetData.doGet(GetData.java:27)
所以我试图找出原因,在某处我读到我需要在hibernate配置文件中将当前会话上下文设置为“thread”。但是当我这样做时,我得到了这样的信息:
GRAVE: Servlet.service() for servlet [GetData] in context with path [/CarnetContacts] threw exception [org.hibernate.LazyInitializationException: could not initialize proxy - no Session] with root cause
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at domain.Contact_$$_javassist_1.getLastName(Contact_$$_javassist_1.java)
消息的第二行表明它与延迟加载有关,但是最后一行我显示当程序试图获取“lastname”属性时出现错误,该属性基本上是一个字符串,所以我不知道我认为这是“懒惰的”。
所以,如果有人能帮我找到解决方案,那就非常友好了。
dao方法的代码:
public Contact getContact(int contactId){
Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
Transaction t = session.beginTransaction();
t.begin();
Contact contact =(Contact) session.load(Contact.class, new Integer(contactId));
t.commit();
return contact;
}
答案 0 :(得分:2)
在这种情况下,您的具体问题是您使用的是Session.load()
而不是Session.get()
。
load()
会返回一个延迟初始化的代理,因此只应在特殊情况下使用,在大多数情况下,您需要使用get()
。
一般来说,除了这种特殊情况,视图层中延迟初始化的问题可以使用以下方法之一解决:
在呈现视图之前获取所有必需的数据(使用JOIN FETCH
,Hibernate.initialize()
等)