文档章节

JFinal教程JfinalUIB 代码笔记 (1)--- jfinal 乐观锁

littleant
 littleant
发布于 2014/06/11 17:10
字数 405
阅读 3485
收藏 7

继承Model类,实现自己的BaseModel,重写save()和update()方法,然后所有的Model都继承自BaseModel

 /**
  * 重写save方法
  */
 public boolean save() {
  this.set(getTable().getPrimaryKey(), ToolUtils.getUuidByJdk(true)); // 设置主键值
  if(getTable().hasColumnLabel("version")){ // 是否需要乐观锁控制
   this.set("version", Long.valueOf(0)); // 初始化乐观锁版本号
  }
  return super.save();
 }
/**
  * 重写update方法
  */
 @SuppressWarnings("unchecked")
 public boolean update() {
  Table table = getTable();
  String name = table.getName();
  String pk = table.getPrimaryKey();
  
  // 1.数据是否还存在
  String sql = new StringBuffer("select version from ").append(name).append(" where ").append(pk).append(" = ? ").toString();
  Model<M> modelOld = findFirst(sql , getStr("ids"));
  if(null == modelOld){ // 数据已经被删除
   throw new RuntimeException("数据库中此数据不存在,可能数据已经被删除,请刷新数据后在操作");
  }
  
  // 2.乐观锁控制
  Set<String> modifyFlag = null;
  try {
   Field field = this.getClass().getSuperclass().getSuperclass().getDeclaredField("modifyFlag");
   field.setAccessible(true);
   Object object = field.get(this);
   if(null != object){
    modifyFlag = (Set<String>) object;
   }
   field.setAccessible(false);
  } catch (NoSuchFieldException | SecurityException e) {
   log.error("业务Model类必须继承BaseModel");
   e.printStackTrace();
   throw new RuntimeException("业务Model类必须继承BaseModel");
  } catch (IllegalArgumentException | IllegalAccessException e) {
   log.error("BaseModel访问modifyFlag异常");
   e.printStackTrace();
   throw new RuntimeException("BaseModel访问modifyFlag异常");
  }
  boolean versionModify = modifyFlag.contains("version");
  if(versionModify && getTable().hasColumnLabel("version")){ // 是否需要乐观锁控制
   Long versionDB = modelOld.getLong("version"); // 数据库中的版本号
   Long versionForm = getLong("version"); // 表单中的版本号
   if(!(versionForm > versionDB)){
    throw new RuntimeException("表单数据版本号和数据库数据版本号不一致,可能数据已经被其他人修改,请重新编辑");
   }
  }
  
  return super.update();
 }
 /**
  * 获取表映射对象
  * 
  * @return
  */
 public Table getTable() {
  return TableMapping.me().getTable(getClass());
 }

所有需要乐观锁控制的表都加上version字段,在更新数据的表单页面加上

<input type="hidden" name="version" value="${version + 1}">

© 著作权归作者所有

共有 人打赏支持
littleant

littleant

粉丝 274
博文 13
码字总数 10514
作品 1
武汉
高级程序员
加载中

评论(3)

giianhui
giianhui
非常好,受用了
littleant
littleant

引用来自“雁南飞0207”的评论

能解释一下ToolUtils.getUuidByJdk(true)吗?ToolUtils是您自己写的工具类吗?
jdk自带
雁南飞0207
能解释一下ToolUtils.getUuidByJdk(true)吗?ToolUtils是您自己写的工具类吗?
基于JFinal实现的权限管理系统 JFinalUIB

项目用到了众多的开源组件,还有一些是网络分享的学习示例代码片段,感谢他们!!! JFinal高级学习交流QQ群:309647612 代码库地址:http://git.oschina.net/dongcb678/JfinalUIB.git 项目背景...

littleant
2014/06/03
0
35
最近在做的一件事件编写JFinal教程《Jfinal极速开发实战》

从8月1号开始,整整一个月,初稿完成,朋友帮我第一次文字校对完成,现在正在根据波总的意见修改一些jfinal的设计原则说明 Jfinal、JfinalUIB学习交流QQ群:309647612 已经完成,前四章免费阅...

littleant
2015/08/20
0
12
JFina教程JfinalUIB 代码笔记 (3)--- jfinal Controller参数封装

通常我们使用jfinal开发都会写自己的BaseController来做一些公共全局变量的声明,或者用来实现一些公共方法,JfinalUIB也不例外。 参数的封装主要是在ParamPkgInterceptor类中实现,采用的是...

littleant
2014/06/12
0
5
jweb——修改自jfinaluib的java管理系统开发基础框架

项目地址: https://git.oschina.net/xjtweb/jweb.git 几点说明: 一、本工程修改自jfinaluib项目。 二、运行 a、设置jvm参数jweb.home指向工程的工作目录(目录内容参照本文件的同级目录的hom...

xiejuntao
2015/05/22
0
0
JFinal教程JfinalUIB 代码笔记 (5)--- 增加sql打印格式化和参数值输出

先上图看效果 sql格式化 用hibernate的都知道他的sql格式化打印还是很不错的,直接摘取过来用用了,改了个类名叫ToolSqlFormatter 下面是修改jfinal sql输出的地方 参数输出,修改jfinal Di...

littleant
2014/08/28
0
3

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
20分钟前
0
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
5
2
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
1
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
1
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部