iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >分享JPA的几个小技巧
  • 212
分享到

分享JPA的几个小技巧

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

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

摘要

目录1. 基本字段介绍2. 自定义ID生成器3. 自动填充字段4. End关系型数据库其实很讨人厌,尤其是在你使用数据库驱动的开发模式时。需要首先把表给创建好了,然后再使用代码生成器

关系型数据库其实很讨人厌,尤其是在你使用数据库驱动的开发模式时。需要首先把表给创建好了,然后再使用代码生成器反向生成一堆几乎无法可读的代码。当字段有变更的时候,又是一番折腾。

这其中的典型,就是mybatis,所以催生了更加简洁的MyBatis Plus。

了解到一些大厂(阿里、腾讯、抖音等),JPA的使用也越来越广泛了,包括我们公司,这是把合适的工具放到了合适的地方。如果想要快速开发,JPA无疑是一个比较好的选择。你无需关注数据库表的结构,使用代码驱动即可完成工作,管它后面是Mysql还是oracle。JPA把数据库相关的知识给弱化了,让你专注于业务开发。

我个人曾是非常排斥JPA这种弱化sql的工具的,这源于对早起Hibernate版本的错误认识。但尝试过mybatis、spring-data-jdbc、jooq后,发现这个东西是真的香!一个迟到的赞,送给JPA。

这对一些管理系统来说,非常合适。因为性能并不是这些系统主要的痛点,业务复杂性才是。

本文将介绍一个简单的实体类,需要准备哪些基本字段。这些字段,又是如何在代码中被使用的。

1. 基本字段介绍

首先看一下我们的基础定义类。

代码不多,信息却不少。

下面来一行行解析。


@Data

Data注解是属于lombok类的,lombok是地球人都知道的代码简化工具,提供了非常多的注解。如果你不想记忆太多的注解,直接加上一个Data,是最偷懒的选择。


@MappedSuperclass

这个注解是JPA的,用来标识父类。标注为@MappedSuperclass的类将不是一个完整的实体类,不会映射到数据库表,但是它的属性都将映射到子类的数据库字段中。放在这里再合适不过了。


@EntityListeners(AuditingEntityListener.class)

开启自动审计功能,这个和下面的两个日期字段是相互配合的,我们稍后介绍。


@JSONIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}) //直接使用bean时,避免json序列号失败

有时候,我们想要再controller层直接使用JPA的实体。但JPA内部其实是有很多附加变量的,比如hibernateLazyInitializer

为了让实体在json序列化的时候能够正常进行,需要忽略这两个字段。所以这个注解,是属于jackson json的。

2. 自定义ID生成器

JPA其实提供了非常多的ID生成策略。不过,在互联网应用下,应用较多的还是雪花算法,因为它有着良好的扩展性,在数据迁移的时候也不会有很多冲突。

为了指定雪花算法,我们需要下面几行代码。


 static final String ID_GEN = "cn.xjjdog.bcmall.utils.db.DistributedId";
 @Id
 @GenericGenerator(name = "IdGen", strategy = ID_GEN)
 @GeneratedValue(generator = "IdGen")

其中的一个关键,就是使用我们名称叫做IdGen的ID生成器。这里的代码,是有一点小遗憾的。由于JVM类加载的缘故,我们无法在注解中直接使用类的名称(*.class.getName()) 来获取它的包路径,只能作为字符串写死在这里。

下面我们就来看一下这个ID生成器的处理。


public class DistributedId implements IdentifierGenerator {
 @Override
 public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object obj) throws HibernateException {
  if (obj == null) throw new HibernateException(new NullPointerException()) ;
  if ((((AbstractEntity) obj).getId()) == null) {
   return String.valueOf(Snowflake.createId());
  } else {
   return ((AbstractEntity) obj).getId();
  }
 }
}

代码如上。在直接使用之前,我们还做了一点小处理。当我们判断实体的ID为空的时候,才使用雪花算法构造一个新的ID;否则使用实体原来设置好的ID,保持不变。

为什么这样做?因为这是有需求的。像订单这种业务,你需要先生成一个订单号,然后再更新一些数据库信息,发布一些消息等;而不是在保存动作出发的时候才生成一个。

如果你不做上面代码的处理。JPA将每次保存的时候都自动生成一个,覆盖了你原有的。我就在这里吃过亏,通过debug代码才进行的修复。

3. 自动填充字段

上面说到createdDatelastModifiedDate两个字段,其实在使用的时候,是不需要手动去设值的。这两个值,将通过审计功能自动完成。


@EntityListeners(AuditingEntityListener.class)

当然,我们还要用特有的注解,来标识这两个字段。



@CreatedDate
private Date createdDate;


@LastModifiedDate
private Date lastModifiedDate;

最后,不要忘了在全局配置中通过Config开启这个功能。


@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

当然,审计是不能没有用户的。所以这个系列还有@CreatedBy注解,用来标注是谁创建的。你需要在代码中组装它们,比如下面的代码,就是从Spring Sercurity中获取用户信息。


@Configuration
@Slf4j
public class UserAuditor implements AuditorAware<String> {
 @Override
 public Optional<String> getCurrentAuditor() {
  UserDetails user;
  try {
   user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
   return Optional.ofNullable(user.getUsername());
  }catch (Exception e){
   return Optional.empty();
  }
 }
}

4. End

JPA写管理系统,真的是神器。当你不需要考虑极限的代码效率时,是一个非常好的选择。再看看最近的MyBatis版本,包括MyBatis Plus设计,很多东西已经和JPA越来越像了。因为在设计上来说,JPA是最接近面向对象编程的思想的。

B端复杂业务的技术栈,并不需要和C端的技术栈相雷同。JPA显然通过极少的代码和约定,就能把事情搞定,让开发者真正的把重点关注到业务开发上来。后面的文章,我们还会用到MyBatis和MyBatis Plus,到时候,我们再详细分析它们使用的场景。

以上就是分享JPA的几个小技巧的详细内容,更多关于JPA 技巧的资料请关注编程网其它相关文章!

--结束END--

本文标题: 分享JPA的几个小技巧

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

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

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

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

下载Word文档
猜你喜欢
  • 分享JPA的几个小技巧
    目录1. 基本字段介绍2. 自定义ID生成器3. 自动填充字段4. End关系型数据库其实很讨人厌,尤其是在你使用数据库驱动的开发模式时。需要首先把表给创建好了,然后再使用代码生成器...
    99+
    2022-11-11
  • 分享shell编程中的几个小技巧
    1、打印一些头信息command << dilimiter…………dilimiter 以分界符号dilimiter中的内容作为命令的标准输入常用在echo命令中,这样就避免了没输出一行就要使...
    99+
    2022-06-04
    几个 小技巧 shell
  • 分享几个写简洁java代码的小技巧
    目录1.定义配置文件信息2.用@RequiredArgsConstructor代替@Autowired3.不要返回null4.ifelse5.减少controller业务代码6.将字...
    99+
    2022-11-13
  • 几个关于pythonPdf技巧的分享
    目录1.读取PDF2.删除pdf的某些页3.旋转页面4.合并pdf前言: PyPDF2是一个纯Python的开源库,能够分割或合并PDF文件,也可以裁剪或转换PDF文件中的页面。我们...
    99+
    2022-11-13
  • 分享Python 的十个小技巧
      一. 列表、字典、集合、元组的使用  from random import randint, sample  # 列表解析  data = [randint(-10, 10) for _ in xrange(10)]  filter(l...
    99+
    2023-01-31
    小技巧 Python
  • 常用的29个CSS小技巧分享
    本篇内容主要讲解“常用的29个CSS小技巧分享”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常用的29个CSS小技巧分享”吧!1.清除图片下方出现几像素的空白间...
    99+
    2022-10-19
  • 分享5个JavaScript的写法小技巧
    目录前言过滤空值数组对象解构分隔数字箭头函数直接返回对象await 链条总结前言 JavaScript 易上手,但是难以全面掌握;它有许多“怪癖”,只有在长时...
    99+
    2022-11-13
  • 分享常用的3个C++小技巧
    目录1、头文件是引用<iostream.h>还是<iostream>?2、逗号分割表达式3、在main函数之前运行代码1、头文件是引用<iostream...
    99+
    2022-11-12
  • Python语言的10个小技巧分享
    这篇文章主要讲解了“Python语言的10个小技巧分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python语言的10个小技巧分享”吧!10个Python小技巧1. 用ZIP处理列表假设...
    99+
    2023-06-16
  • 分享11个常用JavaScript小技巧
    目录1.通过条件判断向对象添加属性2.检查对象中是否存在某个属性3.解构赋值4.循环遍历一个对象的key和value5.使用可选链(Optionalchaining)避免访问对象属性...
    99+
    2022-11-13
  • 分享几个JavaScript运算符的使用技巧
    目录一、可选链接运算符【?.】二、逻辑空分配(?? =)三、逻辑或分配(|| =)四、逻辑与分配(&& =)最后ECMAScript发展进程中,会有很...
    99+
    2022-11-12
  • 7个Python中的隐藏小技巧分享
    目录前言1、功能属性2、不完整代码的占位符3、 eval() 函数4、在 Python 解析器中使用以下命令启动文件托管服务器5、无限参数6、Zip() 方法7、旋转列表前言 Pyt...
    99+
    2023-03-20
    Python隐藏技巧分享 Python隐藏技巧 Python技巧
  • 分享7个杀手级JS小技巧
    目录一、数组乱序二、复制到剪贴板三、数组去重四、检测黑暗模式五、滚动到顶部六、滚动到底部七、生成随机颜色一、数组乱序 在使用需要某种程度的随机化的算法时,你会经常发现洗牌数组是一个相...
    99+
    2022-11-13
  • 关于JavaScript中JSON的5个小技巧分享
    目录1.格式化2.隐藏字符串化数据中的某些属性3.使用toJSON创建自定义输出格式4.恢复数据5.使用revivers隐藏数据1. 格式化 默认的字符串化器还会缩小 JSON,看起...
    99+
    2022-11-13
  • 分享Python中四个不常见的小技巧
    目录1. 引言2. 获取 n 个最大数字3. 获取 n 个最小数字4. 删除字符串的特定部分5. 从列表中删除重复元素6. 总结1. 引言 在编程界,每个人都希望自己可以写出世界上最...
    99+
    2022-11-11
  • Vue中$once的两个实用小技巧分享
    目录前言清除定时器$once/$emit + async/await 实现 Dialog 同步执行总结前言 在 Vue 中有很多 API 都有很实用的地方,只是需要挖掘适用的场景,这...
    99+
    2022-11-13
  • 分享Vue的一些小技巧
    这篇文章主要介绍“分享Vue的一些小技巧”,在日常操作中,相信很多人在分享Vue的一些小技巧问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分享Vue的一些小技巧”的疑惑有所帮...
    99+
    2022-10-19
  • 一个有趣的命令:php -S(小技巧分享)
    我们知道 PHP从5.4.0起,内置了一个http服务器,开发人员就可以借助这个内置服务器来做一些本地测试,那是如何启动的呢?启动方式如下:php -S ip:port这种启动,如果关闭了当前终端后,服务即停止了...那咋办?这里给大家介绍...
    99+
    2022-08-10
    php
  • Python知识之列表的十个小技巧分享
    目录一、提要    二、十个典型功能2.1 倒排列表  reverse()2.2 更换列表排列顺序 2.3 函数的生成器参数2.4 ...
    99+
    2023-01-04
    Python知识 Python列表 Python列表技巧
  • 今天分享几个少见却很有用的 JS 技巧
    1. “返回”按钮 使用 history.back() 可以创建一个浏览器“返回”按钮。 <button onclick="history.back()"> ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作