今天在做SSH整合实现后台发布系统时发现一个问题:
启动项目后,正常插入数据,插入成功,但是第二次插入时候报错(没有重新启动项目,只是刷新网页),报错详情如下:
检查后发现在action中没有加入@Scope("prototype")
@Scope("prototype")的意思是每次都会创建一个新的action,这样就不会有冲突了
如果不加这句话,那么像我上面这样刷新页面想再次插入数据的时候就还会使用上一个的action实例,所以报错信息会显示 detached entity passed to persist ,这个报错一般会在插入数据ID重复的时候出现,所有很自然就联想到了我的bean实例对象是不是重负了呢?
起初我还以为是因为hibernate里session的问题,session对象没有关闭,因为我用的是hibernateTemplate对象,后来我发现hibernateTemplate这个东西内部实现就封装了session.close方法!
Spring会为我自动在beanFactory中新建实例,如果我不管理它们的周期不全都乱套了