getCurrentSession()时抛nullpointer异常

ale0012 2011-08-19 03:14:08
public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new Configuration().configure().buildSessionFactory();
}
catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
}

}


public class DBManager {

private Session session;

public void open(){
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
//return session;
}

public void add(Object o){
session.save(o);
session.getTransaction().commit();
}

public Query query(String hql){
return session.createQuery(hql);
}


public void close(){
HibernateUtil.getSessionFactory().close();
}

}



ublic class UserDAO {
private DBManager dbMan;

public UserDAO(){
dbMan = new DBManager();
}

public boolean checkUser(User user){
try{
dbMan.open();
Query query = dbMan.query(
"from User user where user.userName='"+user.getUserName()+
"' and user.userPwd='"+ user.getUserPwd()+"'");

if(query.list().size()>0){
dbMan.close();
return true;
}
else {
dbMan.close();
return false;
}

}catch(Exception e){
e.printStackTrace();
return false;
}
}

public void addUser(User user){

dbMan.open();
dbMan.add(user);
dbMan.close();


}


}



java.lang.NullPointerException
at org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge.nextTimestamp(RegionFactoryCacheProviderBridge.java:93)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:670)
at org.hibernate.context.ThreadLocalSessionContext.buildOrObtainSession(ThreadLocalSessionContext.java:143)
at org.hibernate.context.ThreadLocalSessionContext.currentSession(ThreadLocalSessionContext.java:104)
at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
at com.since1987.util.DBManager.open(DBManager.java:11)
at com.since1987.dao.UserDAO.checkUser(UserDAO.java:19)
at com.since1987.action.RegisterAction.execute(RegisterAction.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:278)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)

当我进行query或add操作时,第一次没有问题。第二次操作就抛nullpointer异常。

怎么会这样子呀?好像获取不到session的样子
...全文
161 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ale0012 2011-08-19
  • 打赏
  • 举报
回复
呵呵,这下看明白了。。return new Configuration().configure().buildSessionFactory()只是在第一次open的时候调用,到后面就是直接return已有的那个SessionFactory。而被我关闭之后就变成null了。多谢多谢。
高手,关于在web容器销毁时关闭SessionFactory,可以稍微讲一下吗?

[Quote=引用 12 楼 chenhao1208 的回复:]

引用 5 楼 ale0012 的回复:

引用 4 楼 chenhao1208 的回复:
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?


我下次再重新进行open()操……
[/Quote]
暗然的白天 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ale0012 的回复:]

嗯,多谢,刚才把close方法去掉之后确实正常了。关于“web容器销毁”可以举个例子吗,呵呵,我刚学J2EE,很多东西还不是很懂。

引用 9 楼 chenhao1208 的回复:
引用 5 楼 ale0012 的回复:

引用 4 楼 chenhao1208 的回复:
if(query.list().size()>0){
dbMan.close();
return true;
……
[/Quote]
这个你不用太在意。我想的是当Tomcat容器或者是数据源销毁的时候调用一下。很多情况下不用处理就OK
暗然的白天 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ale0012 的回复:]

引用 4 楼 chenhao1208 的回复:
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?


我下次再重新进行open()操作的时候不是又从HibernateUtil那重……
[/Quote]
看好,你的open()方法只是得到了一个session而不是sessionFactory
你的sessionFactory是这样来的:
return new Configuration().configure().buildSessionFactory();
除非你在运行addUser的时候,在运行一下这个方法,明白不,但是这样显然是不合理的。一般的sessionFactory都是单例的,也是Hibernate官方推荐使用的
ale0012 2011-08-19
  • 打赏
  • 举报
回复
嗯,多谢,刚才把close方法去掉之后确实正常了。关于“web容器销毁”可以举个例子吗,呵呵,我刚学J2EE,很多东西还不是很懂。

[Quote=引用 9 楼 chenhao1208 的回复:]
引用 5 楼 ale0012 的回复:

引用 4 楼 chenhao1208 的回复:
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?


我下次再重新进行open()操作……
[/Quote]
暗然的白天 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ale0012 的回复:]

可是我看官方的实例程序在操作完毕后也调用了sessionFactory的close方法耶。关掉sessionFactory后在我重新调用getSessionFactory() 后不是又会重新创建吗?还是说final以后就无法重新创建了?这位哥们,可以说得详细些吗,呵呵。。

引用 5 楼 ale0012 的回复:
引用 4 楼 chenhao1208 的回复:
if(query.list……
[/Quote]
实例上在关闭了sessionFactory后,还有其他的对数据库的操作吗。那只是个小例子
暗然的白天 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ale0012 的回复:]

引用 4 楼 chenhao1208 的回复:
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?


我下次再重新进行open()操作的时候不是又从HibernateUtil那重……
[/Quote]
sessionFactory不可以这样操作。除非你的web容器销毁的时候你可以让sessionFactory关闭。其他情况都不能,sessionFactory可以认为是你一个数据库链接池的一个抽象。
ale0012 2011-08-19
  • 打赏
  • 举报
回复
可是我看官方的实例程序在操作完毕后也调用了sessionFactory的close方法耶。关掉sessionFactory后在我重新调用getSessionFactory() 后不是又会重新创建吗?还是说final以后就无法重新创建了?这位哥们,可以说得详细些吗,呵呵。。

[Quote=引用 5 楼 ale0012 的回复:]
引用 4 楼 chenhao1208 的回复:
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?


我下次再重新进行open()操作的时候不是又从HibernateUtil那重新……
[/Quote]
飓风zj 2011-08-19
  • 打赏
  • 举报
回复
你肯定是把session给关掉了
剑神一笑 2011-08-19
  • 打赏
  • 举报
回复
session可以随便关
sessionFactory别瞎关
private static final SessionFactory sessionFactory = buildSessionFactory();
sessionFactory 是静态的 一般只要你不退出系统就一直存在
不需要你去管他

[Quote=引用 4 楼 chenhao1208 的回复:]
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?
[/Quote]
ale0012 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chenhao1208 的回复:]
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?
[/Quote]

我下次再重新进行open()操作的时候不是又从HibernateUtil那重新获得一个sessionFactory吗?
暗然的白天 2011-08-19
  • 打赏
  • 举报
回复
if(query.list().size()>0){
dbMan.close();
return true;
}

这怎么把sessionFactory关闭了?那你在addUser方法里在执行open()方法拿CurrentSession还能拿到吗?
永无止境 2011-08-19
  • 打赏
  • 举报
回复
ale0012 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yxk19890903 的回复:]
好长啊
[/Quote]呵呵,主要就是红色的那几条异常啦
风火轮 2011-08-19
  • 打赏
  • 举报
回复
好长啊

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧