返回顶部
首页 > 资讯 > 精选 >Jpa怎么使用@EntityListeners实现实体对象的自动赋值
  • 675
分享到

Jpa怎么使用@EntityListeners实现实体对象的自动赋值

2023-06-20 19:06:13 675人浏览 八月长安
摘要

这篇文章主要介绍“Jpa怎么使用@EntityListeners实现实体对象的自动赋值”,在日常操作中,相信很多人在Jpa怎么使用@EntityListeners实现实体对象的自动赋值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作

这篇文章主要介绍“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实现实体对象的自动赋值

到此,关于“Jpa怎么使用@EntityListeners实现实体对象的自动赋值”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Jpa怎么使用@EntityListeners实现实体对象的自动赋值

本文链接: https://lsjlt.com/news/299441.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Jpa怎么使用@EntityListeners实现实体对象的自动赋值
    这篇文章主要介绍“Jpa怎么使用@EntityListeners实现实体对象的自动赋值”,在日常操作中,相信很多人在Jpa怎么使用@EntityListeners实现实体对象的自动赋值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-20
  • Jpa 如何使用@EntityListeners 实现实体对象的自动赋值
    1、简介 1.1 @EntityListeners 官方解释:可以使用生命周期注解指定实体中的方法,这些方法在指定的生命周期事件发生时执行相应的业务逻辑。 简单来说,就是监听实体对象...
    99+
    2024-04-02
  • 基于JPA实体类监听器@EntityListeners注解的使用实例
    JPA实体类监听器@EntityListeners注解的使用 被@Prepersist注解的方法 ,完成save之前的操作。 被@Preupdate注解的方法 ,完成update之前...
    99+
    2024-04-02
  • java中给实体对象属性的空值赋默认值
    目录给实体对象属性的空值赋默认值给实体类赋默认值通用方法给实体对象属性的空值赋默认值 private final String defaultStr = ""; private fi...
    99+
    2024-04-02
  • java反射给对象属性赋值怎么实现
    Java反射可以通过`java.lang.reflect.Field`类来给对象的属性赋值。以下是一个示例代码: import ja...
    99+
    2023-10-27
    java
  • 怎么用vue的$set实现给数组集合对象赋值
    这篇“怎么用vue的$set实现给数组集合对象赋值”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • C++中怎么实现对象的拷贝与赋值操作
    今天就跟大家聊聊有关C++中怎么实现对象的拷贝与赋值操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。拷贝构造函数,顾名思义,等于拷贝 + 构造。它肩负着创建新对象的任务,同时还要负...
    99+
    2023-06-17
  • java怎么使用反射给对象属性赋值
    本文小编为大家详细介绍“java怎么使用反射给对象属性赋值”,内容详细,步骤清晰,细节处理妥当,希望这篇“java怎么使用反射给对象属性赋值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言最近项目中遇到一个问题...
    99+
    2023-07-05
  • java自动创建子类对象怎么实现
    在Java中,可以通过继承和实现接口来自动创建子类对象。1. 继承:子类通过继承父类,可以自动获得父类的属性和方法。使用关键字`ex...
    99+
    2023-09-22
    java
  • jpa自动生成数据表怎么实现
    JPA(Java Persistence API)是JavaEE的一个规范,用于简化Java应用程序与数据库之间的交互。JPA提供了...
    99+
    2023-10-20
    jpa
  • SpringBoot+jpa配置怎么根据实体类自动创建表
    这篇文章主要介绍“SpringBoot+jpa配置怎么根据实体类自动创建表”,在日常操作中,相信很多人在SpringBoot+jpa配置怎么根据实体类自动创建表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S...
    99+
    2023-06-25
  • Mybatis-Plus实现公共字段自动赋值的方法
    目录1 mybatis-plus实现自动填充指定字段1.1 需要修改的字段在模型类上添加1.2 新建一个MetaObjectHandler的实现类2 通用字段自动填充的最佳实践总结2...
    99+
    2024-04-02
  • mybatis resultmap怎么为对象赋值的调用顺序
    这篇文章主要介绍“mybatis resultmap怎么为对象赋值的调用顺序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis resultmap怎么为对象赋值的调用顺...
    99+
    2023-06-29
  • idea自动生成实体类怎么实现
    实现自动生成实体类的一个方法是使用反射机制和注解来实现。 首先,在需要自动生成实体类的项目中定义一个注解,例如 @Entity 注解...
    99+
    2023-10-24
    idea
  • bootstrap实现的媒体对象叫什么
    本篇内容主要讲解“bootstrap实现的媒体对象叫什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“bootstrap实现的媒体对象叫什么”吧! ...
    99+
    2024-04-02
  • 使用jpa的实体对象转json符串时懒加载的问题及解决
    目录解决转json符串时懒加载问题方法(1)解决转json符串时懒加载问题方法(2)Rest风格中关于JPA使用懒加载的坑解决转json符串时懒加载问题方法(1) 1.导入hiber...
    99+
    2024-04-02
  • 怎么在Java中实现实体对象的三种状态
    怎么在Java中实现实体对象的三种状态?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. ...
    99+
    2023-05-30
    java
  • 怎么使用JPA+querydsl实现多条件动态查询
    这篇文章将为大家详细讲解有关怎么使用JPA+querydsl实现多条件动态查询,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JPA querydsl多条件动态查询相信很多人在做订单管理的时候会用到多条件的...
    99+
    2023-06-29
  • 使用jpa的时候set实体类属性自动持久化的解决方案
    使用jpa的时候set实体类属性自动持久化 实例代码 Set<User> users = new HashSet<User>(); User user...
    99+
    2024-04-02
  • springboot使用redis对单个对象进行自动缓存更新删除的实现
    Springboot的项目搭建在此省略,pom文件依赖什么的就不说了 创建一个实体类 @Data @EqualsAndHashCode(callSuper = true) @A...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作