JFinal教程JfinalUIB 代码笔记 (1)--- jfinal 乐观锁
JFinal教程JfinalUIB 代码笔记 (1)--- jfinal 乐观锁
littleant 发表于4年前
JFinal教程JfinalUIB 代码笔记 (1)--- jfinal 乐观锁
  • 发表于 4年前
  • 阅读 3375
  • 收藏 7
  • 点赞 3
  • 评论 3

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: JFinal教程JFinal中乐观锁控制

继承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}">
标签: Jfinal 乐观锁
共有 人打赏支持
littleant
粉丝 270
博文 13
码字总数 10514
作品 1
评论 (3)
雁南飞0207
能解释一下ToolUtils.getUuidByJdk(true)吗?ToolUtils是您自己写的工具类吗?
littleant

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

能解释一下ToolUtils.getUuidByJdk(true)吗?ToolUtils是您自己写的工具类吗?
jdk自带
giianhui
非常好,受用了
×
littleant
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: