Spring Data JPA 从入门到精通~@PreUpdate异常场景分析

1、执行save()后,再次save(),@PreUpdate不再触发

2、@Transient字段的变更,不会触发@PreUpdate方法

3、@PreUpdate 不适用加密/解密场景

1、执行save()后,再次save(),@PreUpdate不再触发

实体:

@Entity
@EntityListeners(MyEntityListener.class)
class MyEntity{ ... }

监听器:

class MyEntityListener{@PrePersist@PreUpdatepublic void doSomething(Object entity){ ... }
}

使用Spring Data生成的DAO。代码行为如下:

MyEntity entity = new Entity();
entity = dao.save(entity); // the doSomething() is called here
// change something it the entity and save it again
dao.save(entity); // the doSomething() is NOT called here, checked with breakpoint

第一次save() 触发了doSomething(),修复实体后,第二次save()不再触发doSomething()...

2、@Transient字段的变更,不会触发@PreUpdate方法

JPA 的 @Transient 注解用于表示一个字段不持久化到数据库中

有一个用户实体类,我正在尝试为此进行密码哈希处理。我认为最简单的方法是创建一个用@Transient注释的密码字段,以及一个在对象持久化之前设置的用@PrePersist和@PreUpdate注释的哈希密码字段。

所以我有这样的东西

@Transient
private String password;private String hashedPassword;@PrePersist
@PreUpdate
private void hashPassword() {if(password != null) {hashedPassword = PasswordHasher.hashPassword(password);}
}

当实体持久存在时,此方法效果很好。密码字段仍在调用hashPassword时设置,并计算并存储hashedPassword的值。 

但是,更新并非如此-即使在合并实体之前设置了新的password值,该字段在hashPassword之前也为null叫做。为什么是这样?至少在实体存在之前,瞬态场的值是否应该一直存在? 

3、@PreUpdate 不适用加密/解密场景

如果仅是简单的单个实体操作,还勉强正确;但是对于一个复杂的聚合,查询了User,然后再查询关联的Company,这样就会触发@PreUpdate,导致User的mobile、cardNO又变成加密状态(关键这时候也没有事务提交动作啊)

@Entity
public class User {/*** 手机号.*/private String mobile;/*** 身份证号.*/private String cardNO;//.../*** 保存/更新前自动加密.*/@PrePersist@PreUpdatepublic void encrypt() {final String mobile = this.getMobile();final String cardNO = this.getCardNO();if (!SM4Util.startWithHeader(mobile)) {this.setMobile(SM4Util.encodeSM4Str(mobile));}if (!SM4Util.startWithHeader(cardNO)) {this.setCardNO(SM4Util.encodeSM4Str(cardNO));}}/*** 解密.*/@PostLoadpublic void decrypt() {// 解密.final String decodeMobile = SM4Util.decodeSM4Str(this.getMobile());final String decodeCardNO = SM4Util.decodeSM4Str(this.getCardNO());this.setMobile(decodeMobile);this.setCardNO(decodeCardNO);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu修改键盘映射

ubuntu修改键盘映射 通过xmodmap -pk 命令找到右shift键得keycode,打算将右shift映射到我笔记本的等号键去,因为笔记本上的等号键还具有加号键得功能,所以需要以下命令: xmodmap -e “keycode 62 equal plus” 62是右shift的keyc…

全球卫星导航 看中国“北斗”

来源:光明日报 作者:袁于飞2017年12月3日,第四届世界互联网大会世界互联网领先科技成果发布活动在浙江乌镇举行,中国卫星导航系统管理办公室主任冉承其介绍北斗卫星导航系统。新华社记者 孟鼎博摄3月30日,我国在西昌卫…

逻辑思维强的人适合学计算机不,逻辑思维强的人适合什么工作?

逻辑思维强的人适合什么工作?逻辑思维题内容:逻辑思维是人的理性认识阶段,人运用概念、判断、推理等思维类型反映事物本质与规律的认识过程。是人们将感性认识提升为理性认识的必要能力。那么逻辑思维强的人适合什么工作呢?逻辑性强的人适合做什么1.逻…

ADSL 拨号代理的搭建

From:崔庆才 - 轻松获得海量稳定代理!ADSL拨号代理的搭建 我们尝试维护过一个代理池。代理池可以挑选出许多可用代理,但是常常其稳定性不高、响应速度慢,而且这些代理通常是公共代理,可能不止一人同时使用,…

用AlphaGo设计材料合成实验

来源:曾林的科学网博客AlphaGo下围棋连挫顶尖高手最终孤独求败的故事几乎家喻户晓。这也引发了大家对人工智能的能力的广泛思考。在科学研究领域,比如说合成实验设计,传统的做法不外乎是依靠经验不断的尝试。纵然会有一些热力学基本规律作为指…

Lambda 表达式详解~简化匿名内部类

本节将介绍如何使用Lambda表达式简化匿名内部类的书写,但Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写。先别在乎细节,看几个例子再说。 例子1:无参函数的简…

app store 服务器维护,AppStore无法连接怎么办?几个小方法教你解决问题

原标题:AppStore无法连接怎么办?几个小方法教你解决问题苹果用户都知道,AppStore我们下载应用的地方,无论是自带软件还是第三方软件都能在这里找到。但是有时候我们会遇上AppStore无法理解的问题!简单来说,…

Python Twisted 介绍

Python Twisted介绍:http://blog.csdn.net/hanhuili/article/details/9389433 原文链接:http://www.aosabook.org/en/twisted.html 作者:Jessica McKellar Twisted 是用 Python 实现的 基于事件驱动 的 网络引擎框架,即一个 网络…

Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'

数据库用的是access,症状是 首页,列表页可以显示,但是内容页无显示 错误如下: Microsoft OLE DB Provider for ODBC Drivers 错误 80004005 readnews.asp 23行 我打开目录 找到readnews.aspx 页面发现,原来23行是一条:…

基于互联网大脑架构的阿里巴巴未来趋势分析【系列2】

作者 刘锋 《互联网进化论》作者,计算机博士前言在计算机科学中,计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调…

Lambda 表达式详解~深入JVM实现原理

读过上一篇之后,相信对Lambda表达式的语法以及基本原理有了一定了解。对于编写代码,有这些知识已经够用。本文将进一步区分Lambda表达式和匿名内部类在JVM层面的区别,如果对这一部分不感兴趣,可以跳过。 经过第一篇的的介绍&…

从别的网站服务器获取数据,使用get()方法以GET方式从服务器获取数据

使用get()方法以GET方式从服务器获取数据我的个人资料$(function () {$("#btnShow").bind("click", function () {var $this $(this);? {$this.attr("disabled", "true");$("ul").append("我的名字叫:&qu…

关于Linq to DataSet

代码 privatePagedDataSource BindMethod(PagedDataSource pds, stringkeyword) { OthersTradeBo bo null; try{ bo newOthersTradeBo(); DataSet ds responseDataSet(bo); DataTable dt ds.Tables…

Twisted 入门 教程

GitHub 地址:https://github.com/likebeta/twisted-intro-cn/tree/master/zh https://github.com/luocheng/twisted-intro-cn 示例代码:https://github.com/jdavisp3/twisted-intro Twisted 与 异步编程入门 系列( 英文 &#x…

OpenAI详细解析:攻击者是如何使用「对抗样本」攻击机器学习的

原文来源:OpenAI作者: Ian Goodfellow、Nicolas Papernot、Sandy Huang、Yan Duan、Pieter Abbeel、Jack Clark.「雷克世界」编译:嗯~是阿童木呀、EVA导语:一般来说,对抗样本(adversarial examples&#xf…

Lambda 表达式详解~Lambda与集合

我们先从最熟悉的*Java集合框架(Java Collections Framework, JCF)*开始说起。 为引入Lambda表达式,Java8新增了java.util.funcion包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便…

轩辕传奇服务器合并信息,轩辕传奇9月1日部分服务器合服公告

轩辕传奇9月1日部分服务器合服公告带个大家,这个更新后服务器合服公告都有哪些内容呢,下面就一起去看看吧。尊敬的轩辕勇士们:《轩辕传奇》开放测试以来人气依旧沸腾,各种战斗的激烈程度也随之升级!为了让勇士们尽享更刺激、更热血…

Java和.NET互操作:应该放弃Web Service吗

通过Web Service混合.NET和Java技术往往很容易,但Web Service并非是.NET和Java互操作的万灵丹。Web Service在集成独立的跨网络通信的组件时非常有用,在简单的调用/返回情景中,涉及的数据类型数量非常有限,且Web Service是基于标准…

京东AI战略宏图展现 不枉挖来这么多AI大牛

来源:网易科技4月15日下午,京东人工智能创新峰会在北京举行。这次会议虽然规模不大,但是堪称重磅,一是在这次会议上京东AI带头人周伯文首次向外界展示京东在AI领域的战略布局与发展方向;二是AI领域重量级人物周志华等大…

Lambda 表达式详解~Streams API~Stream常见接口方法

你可能没意识到Java对函数式编程的重视程度,看看Java 8加入函数式编程扩充多少功能就清楚了。Java 8之所以费这么大功夫引入函数式编程,原因有二: 代码简洁函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环…