Jpa(如何使用@EntityListeners,实现实体对象的自动赋值)

这篇文章主要介绍了Jpa 如何使用@EntityListeners 实现实体对象的自动赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Jpa,如何使用@EntityListeners,实现实体对象的自动赋值,久久派带你了解更多相关信息。

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 数据表

-- 用户表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 实体类

@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;}

@Getter @Setter@MappedSuperclass// 指定对应监听类@EntityListeners(EditListener.class)public abstract class EditMapped extends IdMapped{    private String updateBy;    private Date updateTime;}

用户类

@Entity@Table(name = \"acc_user\")@Getter @Setterpublic class UserEntity extends EditMapped {    private String username;    private String password;}

日志类

@Entity@Table(name = \"modify_log\")@Getter @Setterpublic class ModifyLogEntity extends IdMapped{    private String  action;    private String  entityName;    private String  entityKey;    private String  entityValue;}

2.3 监听类

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);    }}

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);    }}

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

@Repositorypublic interface UserDao extends JpaRepository<UserEntity, Long> {}

@Repositorypublic interface ModifyLogDao extends JpaRepository<ModifyLogEntity, Long> {}

3.2 Service

模拟用户的创建、修改和删除操作

@Servicepublic 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 创建用户

@SpringBootTestpublic class SchoolApplicationTests {    @Autowired    private UserService userService;    @Test    public void testAdd() {        userService.add(\"test1\", \"123456\");    }    }

测试结果

Jpa(如何使用@EntityListeners,实现实体对象的自动赋值) Jpa(如何使用@EntityListeners,实现实体对象的自动赋值)

3.3.2 修改用户

    @Test    public void testUpdate() {        userService.update(1L, \"654321\");    }

测试结果

Jpa(如何使用@EntityListeners,实现实体对象的自动赋值)

Jpa(如何使用@EntityListeners,实现实体对象的自动赋值)

3.3.3 删除用户

	@Test    public void testRemove() {        userService.delete(1L);    }

测试结果

Jpa(如何使用@EntityListeners,实现实体对象的自动赋值)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/9176.html

(0)
nan
上一篇 2021-08-02
下一篇 2021-08-02

相关推荐

  • 新冠病毒核酸检测再次降价(核酸检测价格各省一览表)

    全国各地核酸检测的价格都不一样,有的地方一百多,有的地方几十块钱,根据最新资讯报道,新冠病毒核酸检测再次降价,单人单检不超过60块钱,下面大家就跟久久派小编来了解一下核酸检测价格各省一览表吧!新冠病毒核酸检测再次降价据国家医保局官微消息,新冠病毒核酸检测是疫

    2021-09-18
    0
  • “疑戴3万元耳钉”女副局长露面 !事件再度引发讨论!

    政协会议。据报道,李少莉现身时戴着一对耳环,但并未被确定是否为当初闹得沸沸扬扬的“3万元耳钉”。李少莉的照片被一些媒体和网友通传开来,社交媒体上也掀起了新一轮关于她的讨论和猜测。有的网友认为,这对耳环的价值同样可能非常昂贵,只是没有正面回应;而还有一些网友则认为,既然出席政协会议,那么李少莉肯定已经

    2023-04-24
    0
  • 熊在俄罗斯没地位这件事儿(是真的吗?)

    当人们提到熊时,大脑会将这条信息自动分组:一组是普通人眼中的熊,另一组是俄罗斯人眼中的熊。关于棕熊在俄罗斯的历险故事,从来不会令人失望。棕熊与北极熊共同生活在战斗民族的土地上,

    2021-09-06 热点头条
    0
  • 抖音真正的佛媛(抖音佛媛有哪些)

    网红这股风最近吹到了佛门里,之前的什么“名媛”、“雪媛”已经out了,现在最火的是“佛媛”,一些女网红把自己打造成不谙世事的佛系女子,每天的日常就是打坐念经、抄经、喝下午茶,以此来吸粉博关注,那么抖音佛媛有哪些?抖音真正的佛媛是谁?抖音上佛系的名媛视频是什么?

    2021-09-13
    0
  • 2021双十一手机惠力优度有多大?2021双十一手机推荐

    每年双十一活动都有很多手机数码产品搞活动,今年也不例外,那么2021双十一手机惠力优度有多大呢?下面一起来看看2021双十一手机推荐吧~

    2021-10-08 热点头条
    0
  • 1.2万元拍下单颗荔枝 男子:要送给女友 !

    “一骑红尘妃子笑,无人知是荔枝来”,古有帝王千里快骑,为爱妃送荔枝,博得一笑;今有小伙1.2万元拍下一颗荔枝,豪横送女友。近日,海南海口,一个小伙子在公益拍卖环节,以1.2万元价格拍下一颗“荔枝王”。小伙子表示,要将这颗最好的荔枝送给女友。此事也引起网友热议关注。报道称,2023海口市秀英区火山荔枝

    热点头条 2023-06-04
    0

发表回复

登录后才能评论