弱投影模型_通过投影增强数据模型

弱投影模型

介绍

数据模型可能很棘手。 建模可能会更加困难。 有时候,应该放入数据库表中的信息不一定是我们要在每段代码中使用的信息。

和其他许多次一样,Spring来了。 一个称为投影的小功能可以帮助我们在普通界面中仅用几行数据映射数据。

在本文中,我们将看到一个有关如何使用投影的简单示例。

基础

好的,让我们设置场景。 假设我们有以下实体:

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table
@EqualsAndHashCode(doNotUseGetters = true)
@ToString(doNotUseGetters = true)
public class User implements Serializable {@Id@SequenceGenerator(name = "user_seq", sequenceName = "user_seq")@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "user_seq")private Long id;@Basicprivate String username;@Basicprivate String salt;@Basicprivate String password;@Basicprivate String firstName;@Basicprivate String lastName;
}

此处的一些解释可能会有所帮助:让我们看一下注释。 老实说,我很懒,所以Lombok就在我的小巷旁。 Lombok为我们提供了一种很好的声明方式,表明我们需要:

  • 一个不错的生成器接口来创建bean( @Builder
  • 获取器和设置器( @Data
  • 默认构造函数( @NoArgsConstructor
  • 一个带有所有字段参数的构造函数( @AllArgsConstructor
  • equals()hashCode() ,但是请使用字段,而不是getters( @EqualsAndHashCode(doNotUseGetters = true)
  • toString() ; 再次使用字段( @ToString(doNotUseGetter = true)

其余的注释( @Entity@Table )是旧的JPA。

是的,所以,我们有一个很好的实体。 怎么了

以传统方式获取数据

让我们看一下这个存储库:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {}

上面的代码为我们提供了最少的CRUD方法集。 一个是getOne(Long id) 。 好,不是吗?

好吧,正确的答案必须是:这取决于! 为什么? 因为这将返回整个实体,包括盐和哈希密码。 这是非常敏感的信息。 特别是盐永远不应该被外界吸收。

为了从生成的实体中获取此信息,我们将不得不做大量的手工工作。 只是从我的头开始,我们应该:*创建一个新bean *实现一个映射器以从我们的实体获取到该新bean *确保每次我们处理该实体时,我们都将其映射*在实现该实体时会感到头疼也可能有多种结果。

退还最低要求

值得庆幸的是,Spring可以确保这一天的安全。 一个叫做Projections的小功能让我们以声明的方式定义映射。 这样的接口看起来像这样:

public interface UserProjection {@Value("#{target.getUsername()}")String getUsername();@Value("#{target.getFirstName()}")String getFirstName();@Value("#{target.getLastName()}")String getLastName();
}

Spring将用我们当前正在处理的实体替换target 。 换句话说, target将是User的实例。

我们现在要做的唯一的事情是这样的:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {UserProjection findById(Long id);List<UserProjection> findAllUser();
}

现在,每次调用findById() ,我们都会获得UserProjection的实例。 我们的盐或密码哈希不能泄漏! 更好的是,我们可以对具有多个结果的方法使用相同的过程。

结论

使用Spring Projections,我们可以节省很多代码和麻烦。 @Value()定义可以根据需要变得复杂。 例如,在我当前的项目中,当我们将“有趣的”旧数据库设计映射到更简单的数据模型中时,这为我的团队节省了很多样板代码。

如果您想尝试一下,可以在GitHub上找到一个简单的示例应用程序。

翻译自: https://www.javacodegeeks.com/2018/01/power-data-model-projections.html

弱投影模型

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

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

相关文章

苹果公司的电脑发展史——硬件篇

文章目录一、Apple I&#xff08;1976&#xff09;二、Apple II&#xff08;1977&#xff09;三、Lisa&#xff08;1983&#xff09;四、Macintosh&#xff08;1984&#xff09;五、PowerBook&#xff08;1991&#xff09;六、iMac&#xff08;1998&#xff09;七、iBook&#…

linux attach 指令,以太坊实战-attach命令详解

在前面的实战教程中我们经常提到attach这个命令&#xff0c;今天就针对此命令做更深一步的介绍。官方对此参数的解释如下&#xff1a;attach Start an interactive JavaScript environment (connect to node)也就是说它是一个连接到节点的JavaScript环境的交互窗口。通过它我们…

my.ini修改后服务无法启动_Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署

问题互联网产品高速迭代&#xff0c;通常伴随着高频次的版本发布。部署新版上线需要重启服务&#xff0c;直接 kill 服务进程可能会造成服务短暂不可用&#xff0c;从而影响到正在使用的用户。Spring Cloud 项目中一般会用到 Ribbon 作为负载均衡&#xff0c;那么是不是只要保证…

苹果电脑 Mac OS X 系统诞生的故事和发展历史

文章目录CoplandNeXTRhapsodyOS XPublic Beta (Kodiak)Mac OS X v10.0 (Cheetah)Mac OS X v10.1 (Puma)Mac OS X v10.2 (Jaguar)Mac OS X v10.3 (Panther)Mac OS X v10.4 (Tiger)Mac OS X v10.5 (Leopard)Mac OS X v10.6 (Snow Leopard)Mac OS X Lion2001 年 3 月 24 日&#x…

linux系统普通用户ssh不能登陆,关于CentOS普通用户无法登录SSH问题

Linux命令的返回码列表转自:http://blog.chinaunix.net/uid-10347480-id-3263127.html 在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序 ...iOS开发 GET、POST请求方法(NSURLConnection篇)Web Service使用的主要协议是HTTP协议,即超文本传输协议.…

sap打勾选项记录_记录意外的开关选项

sap打勾选项记录Java开发人员可以做很多事情来使自己的生活以及维护该代码的其他人的生活更加轻松。 在本文中&#xff0c;我将探讨开发人员可以采用的一种非常简单的方法&#xff0c;以使每个人都更轻松。 对于每个阅读这篇文章的人来说&#xff0c;这篇文章的要点似乎都很明显…

Mac OS 的历史

文章目录概述1980年代前20世纪80年代20世纪90年代2000年以后概述 纵观电脑之历史&#xff0c;操作系统与计算机硬件的发展息息相关。 操作系统之本意原为提供简单的工作排序能力&#xff0c;后为辅助更新更复杂的硬件设施而渐渐演化。 从最早的批处理模式开始&#xff0c;分…

linux升级tls,为CentOS升级OpenSSL 让Nginx支持TLS 1.2

最近在调试微信小程序时&#xff0c;发现wx.request请求总是无法正确获取服务器端的数据&#xff0c;经过检查发现是因为服务器端https不支持微信要求的TLS 1.2版本。登录到服务器上&#xff0c;用openssl version -a命令查询&#xff0c;发现版本是0.9.8e&#xff0c;查阅文档…

java 反射 速度_Java反射,但速度更快

java 反射 速度在编译时不知道Java类的最快方法是什么&#xff1f; Java框架通常会这样做。 很多。 它可以直接影响其性能。 因此&#xff0c;让我们对不同的方法进行基准测试&#xff0c;例如反射&#xff0c;方法句柄和代码生成。 用例 假设我们有一个简单的Person类&#x…

macOS 内核之 OS X 系统的起源

文章目录一、苹果公司早期(1972-1991)二、苹果在操作系统上的尝试(1991-1997)2.1 Star Trek 项目 (1992-1993)2.2 Copland-Mac OS 8 (1994-1996)三、收购与转折(1996-1997)四、NeXT 篇章4.1 NEXTSTEP(1985-1997)4.2 OpenStep(1993-1997)五、Mach 的历史5.1 Rochester’s Intell…

docker create_Docker动手教程2.2:容器基本操作2

内容摘要暂停/取消暂停容器删除容器进入容器创建容器暂停/取消暂停容器暂停容器命令&#xff1a;docker pause 容器ID/容器名注意STATUS列&#xff0c;被暂停的容器的状态依旧是“Up”&#xff0c;但是后面括号显示为“Paused”。取消暂停命令&#xff1a;docker unpause 容器I…

c语言全局变量和局部变量作用域重合时,c语言全局变量与局部变量(当变量重名时)的使用情况...

ABP框架 - 时间文档目录 本节内容: 简介 时钟 客户端 时区 客户端 绑定器与转换器 简介 虽然有些应用目标市场只是在一个时区,有些应用目标市场是许多不同时区,为满足这种需求并集中化日期操作,ABP为日期操作提供公 ...mvc5&plus;ef6&plus;Bootstrap 项目心得--身份验证…

jdbc连接gp单例模式_JDBC连接备忘单

jdbc连接gp单例模式抽象 这是常见数据库的JDBC连接的快速参考。 我似乎必须大量查找此信息&#xff0c;因此我认为最好将所有参考资料放在一个地方。 德比 <dependency><groupId>org.apache.derby</groupId><artifactId>derbyclient</artifactId&g…

关于 Mac OS X 内核技术来源

Mach&#xff08;Multiple Asynchronously Communication Hosts&#xff09; 是一个由卡内基梅隆大学开发的操作系统内核&#xff0c;Mach的开发是为了取代BSD的UNIX核心。 Mach 内核的设计目标之一是要兼容 Unix 系统。 当初他们的设想是&#xff0c;真正的操作系统可以作为一…

得到appd url_AppD方法:Java 9支持

得到appd url通过从您的应用程序学习企业APM产品&#xff0c;发现更快&#xff0c;更有效的性能监控。 参加AppDynamics APM导览&#xff01; 阅读有关Java 9模块化功能带来的挑战以及AppDynamics保持在该领域的领导者的严格要求的更多信息。 我们很高兴宣布Java 17全面支持&…

python有趣的面试题_python面试题目

问题一&#xff1a;以下的代码的输出将是什么? 说出你的答案并解释。 class Parent(object): x 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x 2 print Parent.x, Child1.x, Child2.x Parent.x 3 print Parent.x,…

用C语言编程画出图形,C语言图形编程(六) -图形程序设计实例:零件图形的绘制...

实例&#xff1a;一个零件图形的绘制有一个零件图&#xff0c;如下&#xff1a;对图3-1中的零件图形&#xff0c;如何根据它所标注的尺寸&#xff0c;按照适当的顺序有步聚地画出该图形&#xff0c;这首先要分析此零件图形的几何关系&#xff0c;了解构成这个图形各线段的性质&…

Linux 发行版之 CentOS 简介

简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;社区企业操作系统&#xff09;是 Linux 发行版之一&#xff0c;它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码&#xff0c;因此有些要求高…

python异常值如何处理_如何处理异常

python异常值如何处理最近&#xff0c;我与一个朋友进行了讨论&#xff0c;他是一个相对初级但很聪明的软件开发人员。 她问我有关异常处理的问题。 这些问题指出了一种技巧和窍门&#xff0c;肯定有它们的清单。 但是我坚信我们编写软件的方式背后的背景和动机&#xff0c;因此…