博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10、jeecg 默认为空的字段值是如何被填充的?
阅读量:6202 次
发布时间:2019-06-21

本文共 2857 字,大约阅读时间需要 9 分钟。

1、前言

用过 jeecg 的小伙伴,在 jeecg 实体中常见下面几个字段:

/**创建人名称*/private java.lang.String createName;/**创建人登录名称*/private java.lang.String createBy;/**创建日期*/private java.util.Date createDate;/**更新人名称*/private java.lang.String updateName;/**更新人登录名称*/private java.lang.String updateBy;/**更新日期*/private java.util.Date updateDate;

而我们在使用过程中,并没有给其赋,但是存入数据库后却突然冒出值了?

其实不然,在这用到了 ,下面详看一下 jeecg 中的实现代码。

 

2、代码分析

在 org.jeecgframework.core.aop 包下有个 HiberAspect.java,这就是今天的主角,拦截器;

也许你会有疑问,为何要把拦截器放在 aop 这个目录下呀?sorry i don't know...  

 

2.1、为何要使用?

其实,这种需求很常见,比如创建一笔数据,每次创建一笔数据都要去给 createBy createDate.. 赋值,岂不是很麻烦?

而恰好 Hibernate 提供的拦截器就能帮我们实现这样繁琐的问题。

当 session 执行 save()、update()、saveOrUpdate()、delete()以及 flush() 方法时,就会调用拦截器的相关方法,然后在这些方法中实现赋值的逻辑。 

 

2.2、了解如何用

对于用户定义的拦截器必须要实现 org.hibernate.Interceptor 这个接口,在这个接口中主要定义了以下方法。

onDelete(): 删除时调用. onFlushDirty():更新数据时调用,但数据还没有更新到数据库onSave():保存数据的时候调用,数据还没有保存到数据库. preFlush(): 保存,删除,更新 在提交之前调用 (通常在 postFlush 之前). postFlush():提交之后调用(commit之后)

而在 org.hibernate 包中还提供了 Intercepto 接口的一个实现类 EmptyInterceptor,这个类中的所有方法实际上什么也不做,用户自定义的拦截器类也可以扩展此类。 

类继承该接口是官方推荐,并且 jeecg 也是这样用的。

jeecg  onSave() 方法实现赋值:

/* 拦截hibernate save方法(即保存对象之前回调此方法),添加审计信息

 * entity - POJO Instance
 * id - POJO OID
 * state - POJO Instance中每一个属性的值所组成的集合(OID属性除外)
 * propertyNames - POJO Instance中每一个属性的属性名组成的集合(OID属性除外)
 * types - POJO Instance中每一个属性所属类型所对应的Hibernate类型组成的集合(OID属性除外)
 */

public boolean onSave(Object entity, Serializable id, Object[] state,

String[] propertyNames, Type[] types) {    TSUser currentUser = null;    try {        currentUser = ResourceUtil.getSessionUser(); // session 中获取用户信息    } catch (RuntimeException e) {        //logger.warn("当前session为空,无法获取用户");    }    if(currentUser==null){        return true;    }    try {        //添加数据         for (int index=0;index

jeecg  onFlushDirty() 方法脏数据回调:

/**     *  拦截hibernate flush方法(即检查到脏对象时回调此方法),添加审计信息     *  entity - POJO Instance     *  id - POJO OID     *  state - POJO Instance中每一个属性的值所组成的集合(OID属性除外)           *  propertyNames - POJO Instance中每一个属性的属性名组成的集合(OID属性除外)          *  types - POJO Instance中每一个属性所属类型所对应的Hibernate类型组成的集合(OID属性除外)     */      public boolean onFlushDirty(Object entity, Serializable id, Object[] state, Object[] previousState,              String[] propertyNames, Type[] types) {          ....}

 

2.3、xml配置

首先补充一点,Hibernate 的拦截器有两种设置方式:

一种是使用sessionFactory.openSession(Interceptor interceptor),这样的拦截器只会针对该session有效,又叫做局部拦截器。另一种是使用Configuration的setInterceptor(Interceptor interceptor)方法设置,这样的拦截器对每一个session都有效,又称之为全局拦截器,全局拦截器

spring-mvc-hibernate 配置:

  
  ......   
  ......

将审计拦截器作为 sessionFactory 的属性进行配置,即表示此拦截器可以被所有 Session 实例共享;

等同的代码表示方式为:Configuration.setInterceptor(Interceptor inter)。 

也就是上方补充拦截器设置方式二。

 

3、最后

jeecg 提供的不一定是唯一实现方式,通过 aop 也可实现,如有想去自定查询。

博客地址:http://www.cnblogs.com/niceyoo

 

转载于:https://www.cnblogs.com/niceyoo/p/10146274.html

你可能感兴趣的文章
系统压力测试sysbench
查看>>
认识计算机病毒,保护自己免受经济损失
查看>>
IBM WAS8.5创建 概要文件
查看>>
根据手机号获取归属地
查看>>
LINUX查看网卡连接状态
查看>>
logback: 解决 logback.xml 配置不起作用的问题
查看>>
no ip mroute-cache是什么意思
查看>>
我的友情链接
查看>>
Powershell 将User组的成员复制到新组中去
查看>>
图表控件FlowChart.NET详细介绍及免费下载地址
查看>>
python多线程(队列同步)
查看>>
cisco dhcp 单臂路由
查看>>
DNS域名解析
查看>>
Centos 6.6 final 安装 xtrabackup 2.2.12 小记
查看>>
启动tomcat时端口被占用解决方法
查看>>
基于BIND9的智能DNS实现
查看>>
C#如何一个方法实现多个返回值(out和ref的区别)
查看>>
在父页面中获取iframe子页面元素进行相应操作
查看>>
FROMBYTE FOR Sybase Recovery V1.2
查看>>
×××:我国2014年至2015年大规模部署IPV6
查看>>