iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Jpa 如何使用@EntityListeners 实现实体对象的自动赋值
  • 373
分享到

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

2024-04-02 19:04:59 373人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

1、简介 1.1 @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 @Setter
public class UserEntity extends EditMapped {
    private String username;
    private String password;
}

日志类


@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 监听类


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


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

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

3.2 Service

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


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


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

测试结果

在这里插入图片描述 在这里插入图片描述

3.3.2 修改用户


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

测试结果

在这里插入图片描述

在这里插入图片描述

3.3.3 删除用户


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

测试结果

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

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

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Jpa 如何使用@EntityListeners 实现实体对象的自动赋值
    1、简介 1.1 @EntityListeners 官方解释:可以使用生命周期注解指定实体中的方法,这些方法在指定的生命周期事件发生时执行相应的业务逻辑。 简单来说,就是监听实体对象...
    99+
    2024-04-02
  • Jpa怎么使用@EntityListeners实现实体对象的自动赋值
    这篇文章主要介绍“Jpa怎么使用@EntityListeners实现实体对象的自动赋值”,在日常操作中,相信很多人在Jpa怎么使用@EntityListeners实现实体对象的自动赋值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-20
  • 基于JPA实体类监听器@EntityListeners注解的使用实例
    JPA实体类监听器@EntityListeners注解的使用 被@Prepersist注解的方法 ,完成save之前的操作。 被@Preupdate注解的方法 ,完成update之前...
    99+
    2024-04-02
  • IDEA如何自动生成JPA实体类
    小编给大家分享一下IDEA如何自动生成JPA实体类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、连接数据库(mysql)1.1 打开 MySQL 1.2 配置...
    99+
    2023-06-20
  • java中给实体对象属性的空值赋默认值
    目录给实体对象属性的空值赋默认值给实体类赋默认值通用方法给实体对象属性的空值赋默认值 private final String defaultStr = ""; private fi...
    99+
    2024-04-02
  • MybatisPlus如何实现公共字段自动赋值
    这篇文章主要讲解了“MybatisPlus如何实现公共字段自动赋值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MybatisPlus如何实现公共字段自动赋值”吧!1 mybatis-plu...
    99+
    2023-07-02
  • vue $set如何实现给数组集合对象赋值
    本篇内容主要讲解“vue $set如何实现给数组集合对象赋值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue $set如何实现给数组集合对象赋值”吧!vue $set 数组集合对象赋值在vu...
    99+
    2023-06-20
  • Bootstrap媒体对象如何实现
    这篇文章主要介绍“Bootstrap媒体对象如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Bootstrap媒体对象如何实现”文章能帮助大家解决问题。在web页面中,图片居左,内容居右排列,...
    99+
    2023-07-04
  • jQuery如何实现动态给table赋值
    这篇文章主要介绍了jQuery如何实现动态给table赋值,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。html请忽视各种class,因为前...
    99+
    2024-04-02
  • 怎么用vue的$set实现给数组集合对象赋值
    这篇“怎么用vue的$set实现给数组集合对象赋值”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • mybatisresultmap如何为对象赋值的调用顺序
    目录resultmap 为对象赋值的调用顺序java bean定义如下部分mybatis映射文件如下createResultObject方法的代码如下使用resultMap时需注意的...
    99+
    2024-04-02
  • SpringBoot+jpa配置如何根据实体类自动创建表
    目录jpa配置根据实体类自动创建表1.配置文件application.properties2.pom.xml引入包3.编写实体类4.运行项目5.针对项目启动以后数据库并未生成数据库表...
    99+
    2024-04-02
  • C++中怎么实现对象的拷贝与赋值操作
    今天就跟大家聊聊有关C++中怎么实现对象的拷贝与赋值操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。拷贝构造函数,顾名思义,等于拷贝 + 构造。它肩负着创建新对象的任务,同时还要负...
    99+
    2023-06-17
  • Mybatis-Plus实现公共字段自动赋值的方法
    目录1 mybatis-plus实现自动填充指定字段1.1 需要修改的字段在模型类上添加1.2 新建一个MetaObjectHandler的实现类2 通用字段自动填充的最佳实践总结2...
    99+
    2024-04-02
  • spring data jpa如何使用自定义repository实现类
    目录spring data jpa使用自定义repository实现类创建MyJpaRepository实现类创建MyJpaRepositoryFactoryBean配置JPAJpa...
    99+
    2024-04-02
  • 如何在php中实现对象传值与引用传值
    今天就跟大家聊聊有关如何在php中实现对象传值与引用传值,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。变量赋值与对象赋值对比<php   //&n...
    99+
    2023-06-06
  • 如何使用jpa实现动态插入与修改
    这篇文章给大家分享的是有关如何使用jpa实现动态插入与修改的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。jpa之动态插入与修改(重写save)1.动态插入@Data@Entity@DynamicInsert@Ta...
    99+
    2023-06-25
  • JPA中的update如何使用@Query 实现
    今天就跟大家聊聊有关JPA中的update如何使用@Query 实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用JPA中@Query 注解实现update 操作,代码如下:@T...
    99+
    2023-05-31
    jpa @query update
  • 如何使用List对象实现去重
    今天就跟大家聊聊有关如何使用List对象实现去重,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、List<Object>去重People类public class Pe...
    99+
    2023-05-31
    list 去重
  • 使用jpa的实体对象转json符串时懒加载的问题及解决
    目录解决转json符串时懒加载问题方法(1)解决转json符串时懒加载问题方法(2)Rest风格中关于JPA使用懒加载的坑解决转json符串时懒加载问题方法(1) 1.导入hiber...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作