Hibernate 为什么我的儿子关门了?

Hibernate 为什么我的儿子关门了?,hibernate,Hibernate,我试图在hibernate会话中更新一个表,然后通过重新蚀刻hibernate表来刷新本地数据表。如果我不进行更新,我可以毫无问题地刷新本地数据表,但当我添加更新时,服务器日志中会出现以下错误: 严重:org.hibernate.SessionException:会话已关闭 谁能给我一个建议,说明我做错了什么,以及我能做些什么来解决这个问题 谢谢 下面是执行更新的代码。它似乎工作正常,因为我没有得到任何异常,而且我得到的returnstat值为1,表示表已更新并提交 public int upd

我试图在hibernate会话中更新一个表,然后通过重新蚀刻hibernate表来刷新本地数据表。如果我不进行更新,我可以毫无问题地刷新本地数据表,但当我添加更新时,服务器日志中会出现以下错误:

严重:org.hibernate.SessionException:会话已关闭

谁能给我一个建议,说明我做错了什么,以及我能做些什么来解决这个问题

谢谢

下面是执行更新的代码。它似乎工作正常,因为我没有得到任何异常,而且我得到的returnstat值为1,表示表已更新并提交

public int updatePolygonGroupAtrributes( long id, String groupName, String color, long ownerId, int updtUserId )
{
    int stat = 0;
    TbPolygonGroup polyGroup = null;
    TbCustAccount custAcct = null;
    TbUser user = null;

    try
    {
        org.hibernate.Transaction tx = session.beginTransaction();
        polyGroup = (TbPolygonGroup)session.get(TbPolygonGroup.class, id);
        polyGroup.setVcPolygonGroup(groupName);
        polyGroup.setVcColor(color);
        custAcct = (TbCustAccount)session.get(TbCustAccount.class, ownerId);
        System.out.println( "<DbHelper.updatePolygonGroupAtrributes> ownerId = "+custAcct.getBiAccountId()+", Name = "+custAcct.getVcCustAccountName() );
        polyGroup.setTbCustAccount(custAcct);
        polyGroup.setDtUpdTime( new Date() );
        user = (TbUser)session.get(TbUser.class, updtUserId);
        System.out.println( "<DbHelper.updatePolygonGroupAtrributes> update User Id = "+user.getIuserId()+", Name = "+user.getVcUserFirstName()+" "+user.getVcUserLastName() );
        polyGroup.setTbUser(user);
        try
        {
            session.update(polyGroup);
            tx.commit();
            stat = 1;
        }
        catch(Exception e)
        {
            tx.rollback();
            e.printStackTrace();
            status = e.getMessage();
            stat = -1;
        }
    }
    catch( Exception ex )
    {
        ex.printStackTrace();
        status = ex.getMessage();
        stat = -1;
    }
    return stat;
}
public int updatepolygongroupatributes(长id、字符串groupName、字符串颜色、长ownerId、int-updtUserId)
{
int stat=0;
TbPolygonGroup polyGroup=null;
TbCustAccount=null;
TbUser=null;
尝试
{
org.hibernate.Transaction tx=session.beginTransaction();
polyGroup=(TbPolygonGroup)session.get(TbPolygonGroup.class,id);
polyGroup.SETVCPOLYCONGROUP(组名);
polyGroup.setVcColor(颜色);
custact=(tbcustcount)session.get(tbcustcount.class,ownerId);
System.out.println(“ownerId=“+custact.getBiAccountId()+”,Name=“+custact.getVcCustAccountName());
polyGroup.setTbCustAccount(客户账户);
setDtUpdTime(新日期());
user=(TbUser)session.get(TbUser.class,updtUserId);
System.out.println(“更新用户Id=“+User.getIuserId()+”,Name=“+User.getVcUserFirstName()+”“+User.getVcUserLastName());
polyGroup.setTbUser(用户);
尝试
{
更新(polyGroup);
tx.commit();
stat=1;
}
捕获(例外e)
{
tx.回滚();
e、 printStackTrace();
status=e.getMessage();
stat=-1;
}
}
捕获(例外情况除外)
{
例如printStackTrace();
status=ex.getMessage();
stat=-1;
}
返回统计;
}
下面是我在应用程序中调用更新的代码(除了显示我正在做的事情的流程之外,没有真正的相关性)

public void polyGroupUpdateAction()
{
int=0;
字符串clr=“#”+多色;
long ownId=sb1.getLong(selectedPolyOwner,0);
long groupId=selectedPolygonGroup.getBiPolygonGroupId();
int updUserId=sb1.getLoginUserId();
int-retVal=dbHelper.UpdatePolyGongroupAttribute(groupId、polyName、clr、ownId、updUserId);
如果(返回值<0)
{
setMessage(“更新多边形组时出错:+dbHelper.getStatus());
返回;
}
System.out.println(“-----------返回值=“+retVal”);
sb1.setMessage(“多边形组已更新”);
fillPolyGroupList();
返回;
}
下面是我重新填充本地表的相关代码(显示错误发生的位置)

public void fillPolyGroupList()
{
System.out.println(“输入…”);
tbPolygonGroupList=dbHelper.getPolygonGroup();
System.out.println(“重新加载多边形组列表后…”);
PolygongGroupDataModel=新的PolygongGroupDataModel(TBPolygongGroupList);
}
下面是会话日志,它显示更新成功返回,但在尝试重新读取fillPolyGroupList()中的数据表时给出了错误

INFO:ownerId=74,Name=TransCore-David Kerr
信息:更新用户Id=2,名称=Transcore系统
信息:------------返回值=1
信息:正在输入。。。
严重:org.hibernate.SessionException:会话已关闭!
位于org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
位于org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1319)
.....
运行(Thread.java:662)
信息:重新加载多边形组列表后。。。
警告:#{deviceSessionBean.polyGroupUpdateAction}:java.lang.NullPointerException
javax.faces.FacesException:#{deviceSessionBean.polyGroupUpdateAction}:java.lang.NullPointerException
位于com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
在javax.faces.component.UICommand.broadcast(UICommand.java:315)
....
在会话中提交事务时,Hibernate将 自动关闭会话,意味着无法重复使用该会话


在我的链接上,它还解释了如何手动控制会话,以便在函数上测试会话,然后修改所有:)


如果您对hibernate不熟悉,那么最好尝试从maven原型开始您的项目,这将为您提供一个良好的项目结构,例如已经配置好的hibernate/spring

安装maven,输入mvn原型:generate,选择要使用的技术。然后键入mvneclipse:eclipse在新项目上生成eclipse配置文件,最后将其导入eclipse。
它将帮助您开始设置一个完整的堆栈。(Ex archetype appfuse basic spring将创建一个带有SpringMVC、spring和Hibernate的应用)

我尝试了建议的解决方案,将模式改为“手动”而不是“线程”,并围绕访问Hibernate的96个方法中的每一个进行openSession()和Closession()。那是行不通的。在对访问方法进行了几次调用之后,我得到了“无会话”错误。因此,由于某种原因,该解决方案不起作用,更不用说它增加了许多不必要的开销,因为96个方法中只有3个确实进行了更新

因此,我发现在commit()之后只需重新打开一个会话,就可以得到正确的结果,而不是用open/close会话代码包装所有方法

在上面的代码中,我有一行:

tx.commit();
我发现,如果在此之后添加一个openSession(),就会得到我想要的结果。因此,上述代码已从上面的tx.commit()更改为:

tx.commit();
this.session - HibernateUtil.getSessionFactory().openSession();
我只需要将它添加到3个(此时)实际使用的方法中
INFO: <DbHelper.updatePolygonGroupAtrributes> ownerId = 74, Name = TransCore - David Kerr
INFO: <DbHelper.updatePolygonGroupAtrributes> update User Id = 2, Name = Transcore System
INFO: ---------<DeviceSessionBean.polyGroupUpdateAction> Return value = 1
INFO: <DeviceSessionBean.fillPolyGroupList> Entering ... 
SEVERE: org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1319)
.....
at java.lang.Thread.run(Thread.java:662)

INFO: <DeviceSessionBean.fillPolyGroupList> After reloading polygon group list ... 
WARNING: #{deviceSessionBean.polyGroupUpdateAction}: java.lang.NullPointerException
javax.faces.FacesException: #{deviceSessionBean.polyGroupUpdateAction}: java.lang.NullPointerException
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
....
tx.commit();
tx.commit();
this.session - HibernateUtil.getSessionFactory().openSession();