记得之前被 session的问题困扰了很久,也不断遇到很多问题,自己也提出许多解决方案,认识在不断加深中....
我把笔记发上来
执行更新update操作时候出现的问题,后台采用hibernateTemplate操作
Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再接除该sessionFactory的绑定,最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
所以说当配制有OpenSessionInViewFilter就会出现readOnly问题,而不配又出现session关闭的问题,要用hibernateTemplate的话就要考虑配置spring事务
如果用hibernate (uuid.hex)主键生成方式,用spring getSession.save()方法 会插不了数据
用hibernateTemplate就可以
这样的话配置了OpenSessionInViewFilter就出现问题了
想了很久都不知道怎么做,网上总说用事务解决,但我总没成功,
现在其他方法都没问题,就单一个插入操作 我用this.getHibernateTemplate().save();就出现
Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
最后没办法,就单单2个插入操作不可能去改变表结构或者动用其他东西
OpenSessionInViewFilter这家伙不配可不行,我自己用了一个解决方案
public void insert(Consumer c) throws Exception {
final Consumer cc=c;
// this.getHibernateTemplate().save(c);有事务问题
// this.getSession().save(c);
// super.getSession(true).save(c);
// this.getSession().saveOrUpdate(c);这些都插不了数据,也没报错
this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
session.setFlushMode(FlushMode.AUTO);
session.save(cc);
session.flush();
return null;
}
});
}
分享到:
相关推荐
在描述中提到“适用于服务器应用升级”,这可能意味着这个软件包更新是为了适应服务器环境中的一些新需求或兼容性问题。在升级过程中,用户需要确保当前运行的服务器环境与新版本兼容,避免因升级导致的任何服务中断...
Java通过ganymed-ssh2-build210.jar库实现SSH远程连接Linux终端是一个常见的应用场景,主要用于自动化运维、系统管理或者开发过程中需要与Linux服务器交互的场景。ganymed-ssh2-build210.jar是Java的一个开源SSH库,...
import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import common.Logger; import org.apache.commons.lang.StringUtils; import java.io.*; import java.util.logging.Level; /** * SCP远程访问...
SSH框架Maven项目pom.xml
在本项目中,"Node.js-WebSSH2基于Web的SSH2客户端使用xterm.js、socket.io和ssh2实现",我们关注的是构建一个在浏览器环境中运行的SSH2客户端。这个客户端允许用户通过Web界面安全地连接到远程服务器执行命令,从而...
SSH 项目实现步骤 SSH 项目的实现步骤可以分为五个步骤:导入页面、导入数据库驱动、添加 Struts 框架、建立 entity 包和完成登录操作。 第一步:导入页面 在实现 SSH 项目的第一步是导入页面,将页面资料复制到...
SSH.NET是目前最为强大的C#.NET SSH Library类库,为了取代之前的SharpSSH而推出的,dll集合共8个,包括: NET3.5, NET4.0及以上, .NET Standard 1.3 Silverlight 4 Silverlight 5 Windows Phone 7.1 Windows
ssh 例子 ssh 例子 有问题 www.willvc.com.cn 能联系到我
由于其全面的SSH2支持和良好的文档,Ganymed SSH2成为了Java开发者在处理SSH相关任务时的首选库之一。 总结起来,Ganymed SSH2 Build 250是一套全面的SSH2工具包,它提供了所有必要的组件,从运行时库到开发辅助...
SSHTools是一组Java SSH应用程序。包括:Java SSH API, SSH Terminal, SSH secured VNC客户端, SFTP客户端和SSH Daemon。ESftp是根据此项目开发的一个Eclipse插件主要用来在Eclipse开发平台与Sftp服务器之间传输文件...
IDEA 中创建 SSH 项目的详细步骤和配置 在本文中,我们将详细介绍如何使用 IDEA 创建一个 SSH 项目,包括项目的创建、配置和启动过程。 创建 Maven Web 项目 首先,我们需要在 IDEA 中创建一个新的 Maven 项目。...
标题中的“ganymed-ssh2-262.jar”是一个特定版本的SSH2库,由Ganymed项目提供,用于Java环境下的SSH(Secure Shell)连接。SSH是一种网络协议,常用于安全地远程登录到服务器、传输文件以及执行命令。Ganymed SSH2...
所以需要各位自己输入这些信息,位置在webssh.html中 openTerminal( { /*operate:'connect', host: '',//IP port: '',//端口号 username: '',//用户名 password: ''//密码*/ }); 运行展示
ssh2_lib.rar与csdn中的ssh2_src.rar是整个项目,把ssh2_lib.rar下载后,直接放在ssh2_src.rar中的\ssh2_src\SSH2\web\WEB-INF目录下,再配置一下mysql就可以使用了. ssh2_src.rar下载地址: ... ssh2_src.rar的具体使用,...
Ganymed SSH2是一个开源项目,为Java开发者提供了丰富的功能,包括连接到Linux服务器、执行命令、传输文件等。 描述中提到的“java操作linux命令”的功能,意味着这个jar包提供了API接口,允许Java程序通过SSH连接...
本文将深入探讨 `ssh2` 模块的核心概念、功能以及如何在实际项目中应用。 ### SSH2 协议简介 SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他网络服务。它通过加密技术确保数据...
对于初学java框架的小伙伴而言或许有所帮助,若你对框架开发实际项目经验不足,可下载参照此文档,帮你梳理ssh项目开发的基本配置与流程,有助于你快速进入熟悉开发过程与ssh环境搭建的相关步骤
SSH 项目搭建步骤简单示例 SSH 项目搭建步骤简单示例是指使用 SSH 框架搭建一个完整的 Java 项目的步骤,该示例展示了从创建项目到配置 Web.xml 文件、添加 Hibernate 支持、添加 Struts2 支持、配置 Hibernate ...
利用ch.ethz.ssh2操作进行SSH进行操作下载文件代码,主要利用Linux命令进行操作,方便简单