1、简介
1.1 @entitylisteners
官方解释:可以使用生命周期注解指定实体中的方法,这些方法在指定的生命周期事件发生时执行相应的业务逻辑。
简单来说,就是监听实体对象的增删改查操作,并对实体对象进行相应的处理。
1.2 生命周期对应注解
jpa一共提供了7种注解,分别是:
@postload
:实体对象查询之后
@prepersist
: 实体对象保存之前
@postpersist
:实体对象保存之后
@preupdate
:实体对象修改之前
@postupdate
:实体对象修改之后
@preremove
: 实体对象删除之前
@postremove
:实体对象删除之后
通常情况下,数据表中都会记录创建人、创建时间、修改人、修改时间等通用属性。如果每个实体对象都要对这些通用属性手动赋值,就会过于繁琐。
现在,使用这些生命周期注解,就可以实现对通用属性的自动赋值,或者记录相应操作日志。
2、环境准备
数据库:mysql
项目搭建:演示项目通过spring boot 2.2.6构建,引入spring-boot-starter-data-jpa
2.1 数据表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-- 用户表 create table `acc_user` ( `id` bigint(20) not null auto_increment, `username` varchar(40) not null default '' comment '用户名' , `password` varchar(40) not null default '' comment '密码' , `create_by` varchar(80) default null, `create_time` datetime default current_timestamp, `update_by` varchar(80) default null, `update_time` datetime default current_timestamp on update current_timestamp, primary key (`id`) ) engine=innodb default charset=utf8mb4; -- 日志表 create table `modify_log` ( `id` bigint(20) not null auto_increment, `action` varchar(20) not null default '' comment '操作' , `entity_name` varchar(40) not null default '' comment '实体类名' , `entity_key` varchar(20) default null comment '主键值' , `entity_value` varchar(400) default null comment '实体值' , `create_by` varchar(80) default null, `create_time` datetime default current_timestamp, primary key (`id`) ) engine=innodb default charset=utf8mb4; |
2.2 实体类
1
2
3
4
5
6
7
8
9
10
11
12
|
@mappedsuperclass @getter @setter @mappedsuperclass // 指定对应监听类 @entitylisteners(createlistener. class ) public abstract class idmapped { @id @generatedvalue(strategy = generationtype.identity) private long id; private string createby; private date createtime; } |
1
2
3
4
5
6
7
8
|
@getter @setter @mappedsuperclass // 指定对应监听类 @entitylisteners(editlistener. class ) public abstract class editmapped extends idmapped{ private string updateby; private date updatetime; } |
用户类
1
2
3
4
5
6
7
|
@entity @table(name = "acc_user" ) @getter @setter public class userentity extends editmapped { private string username; private string password; } |
日志类
1
2
3
4
5
6
7
8
9
|
@entity @table(name = "modify_log" ) @getter @setter public class modifylogentity extends idmapped{ private string action; private string entityname; private string entitykey; private string entityvalue; } |
2.3 监听类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class createlistener extends basiclistener { // 保存之前,为创建时间和创建人赋值 @prepersist public void prepersist(idmapped idmapped) { if (objects.isnull(idmapped.getcreatetime())) { idmapped.setcreatetime( new date()); } if (stringutils.isblank(idmapped.getcreateby())) { // 根据鉴权系统实现获取当前操作用户,此处只做模拟 idmapped.setcreateby( "test_create" ); } } // 保存之后,记录变更日志 @postpersist public void postpersist(idmapped idmapped) throws jsonprocessingexception { recordlog(action_insert, idmapped); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class editlistener extends basiclistener { // 修改之前,为修改人和修改时间赋值 @preupdate public void preupdate(editmapped editmapped) { if (objects.isnull(editmapped.getupdatetime())) { editmapped.setcreatetime( new date()); } if (stringutils.isblank(editmapped.getupdateby())) { // 根据鉴权系统实现获取当前操作用户,此处只做模拟 editmapped.setupdateby( "test_update" ); } } // 修改之后,记录变更日志 @postupdate public void postupdate(editmapped editmapped) throws jsonprocessingexception { recordlog(action_update, editmapped); } // 删除之前,记录变更日志 @preremove public void preremove(editmapped editmapped) throws jsonprocessingexception { recordlog(action_delete, editmapped); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class basiclistener implements applicationcontextaware { private applicationcontext applicationcontext; protected static final string action_insert = "insert" ; protected static final string action_update = "update" ; protected static final string action_delete = "delete" ; // 记录变更日志 protected void recordlog(string action, idmapped object) throws jsonprocessingexception { // 日志对象不需要再记录变更日志 if (object instanceof modifylogentity) { return ; } modifylogentity modifylogentity = new modifylogentity(); modifylogentity.setaction(action); modifylogentity.setentitykey(string.valueof(object.getid())); modifylogentity.setentityname(object.getclass().getsimplename()); // 对象转json字符串存储 modifylogentity.setentityvalue( new objectmapper().writevalueasstring(object)); optional.ofnullable(applicationcontext.getbean(modifylogdao. class )) .ifpresent(modifylogdao -> modifylogdao.save(modifylogentity)); } @override public void setapplicationcontext(applicationcontext applicationcontext) throws beansexception { this .applicationcontext = applicationcontext; } } |
3、测试
3.1 dao
1
2
3
|
@repository public interface userdao extends jparepository<userentity, long > { } |
1
2
3
|
@repository public interface modifylogdao extends jparepository<modifylogentity, long > { } |
3.2 service
模拟用户的创建、修改和删除操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@service public class userserviceimpl implements userservice { @autowired private userdao userdao; @override @transactional public void add(string username, string password) { userentity userentity = new userentity(); userentity.setusername(username); userentity.setpassword(password); userdao.save(userentity); } @override @transactional public void update( long id, string password) { userentity userentity = userdao.findbyid(id).orelsethrow(() -> new runtimeexception( "用户不存在" )); userentity.setpassword(password); userdao.save(userentity); } @override @transactional public void delete ( long id) { userentity userentity = userdao.findbyid(id).orelsethrow(() -> new runtimeexception( "用户不存在" )); userdao. delete (userentity); } } |
3.3 测试
3.3.1 创建用户
1
2
3
4
5
6
7
8
9
|
@springboottest public class schoolapplicationtests { @autowired private userservice userservice; @test public void testadd() { userservice.add( "test1" , "123456" ); } } |
测试结果
3.3.2 修改用户
1
2
3
4
|
@test public void testupdate() { userservice.update(1l, "654321" ); } |
测试结果
3.3.3 删除用户
1
2
3
4
|
@test public void testremove() { userservice. delete (1l); } |
测试结果
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/loushangdeanshi/article/details/106042385