通过投影增强数据模型

介绍

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

和其他许多次一样,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/348794.shtml

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

相关文章

ListView常用属性、方法

1、设置item间分割线&#xff0c;分割线高度 android:divider"android:color/darker_gray" android:dividerHeight"10dp" 分割线不仅仅可以设置为一个颜色&#xff0c;也可以设置为一个图片资源。 分割线设置为透明&#xff1a; android:divider"…

具有弹性效果的ListView

Android默认的ListView在滚动到顶端或底端&#xff0c;没有很好的提示&#xff0c;下面通过源码来实现弹性效果。 ListView中有一个控制滑动到边缘的处理方法&#xff1a; protected boolean overScrollBy(int deltaX, int deltaY,int scrollX, int scrollY,int scrollRangeX,…

rememberme多久_使用Spring Security添加RememberMe身份验证

rememberme多久我在“ 向Jiwhiz博客添加社交登录”一文中提到&#xff0c;RememberMe功能不适用于Spring Social Security。 好吧&#xff0c;这是因为该应用程序现在不通过用户名和密码对用户进行身份验证&#xff0c;并且完全依靠社交网站&#xff08;例如Google&#xff0c;…

Java 9:对可选的增强

之前 &#xff0c;我写过Java 8中引入的Optional类&#xff0c;该类用于对可能不存在的值进行建模并减少可能引发NullPointerException的位置的数量。 Java 9向Optional添加了三个新方法&#xff1a; 1. ifPresentOrElse 新ifPresentOrElse方法允许你执行一个动作&#xff0c…

电脑还原Mac地址

之前修改过电脑Mac&#xff0c;现在与手机Mac冲突&#xff0c;导致手机无法连接校园网。 控制面板——》打开网络和共享中心——》选择更改适配器设置 本地连接——》右键选择属性 上图选择配置 高级——》在下拉菜单中选择网络地址——》右边选为“不存在” 之后本地连接会自…

聊天ListView使用ViewHolder

聊天界面会展示至少两种布局&#xff0c;即收到消息和发送消息。这样一个ListView与平时使用的ListView的最大不同&#xff0c;在于它有两个不同的布局&#xff1a;收到的布局和发送的布局。需要利用Adapter实现这样的效果。即需要在获取布局的时候判断该获取哪个布局。 public…

动态改变ListView布局

在getView()时&#xff0c;通过判断选择加载不同的布局。 点击某个item的时候&#xff0c;变为foucus状态&#xff0c;其他的items还原。 下面用两个方法给item设置两个不同的布局。 //foucus状态&#xff0c;显示一个ImageViewprivate View addFocusView(int i) {ImageView…

jpa 关系拥有方_JPA:确定关系的归属方

jpa 关系拥有方使用Java Persistence API&#xff08;JPA&#xff09;时&#xff0c;通常需要在两个实体之间创建关系。 这些关系是通过使用外键在数据模型&#xff08;例如数据库&#xff09;中定义的&#xff0c;而在我们的对象模型&#xff08;例如Java&#xff09;中则使用…

JDBC连接备忘单

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

获取View坐标

滑动一个View&#xff0c;即移动一个View&#xff0c;改变其当前所处的位置&#xff0c;通过不断改变View的坐标实现滑动的效果。 1、Android坐标系&#xff1a;坐标原点在屏幕左上角。 public void getLocationOnScreen(int[] location) Computes the coordinates of this vi…

李宏毅 课程打包_按功能而不是按层打包课程

李宏毅 课程打包大多数企业Java应用程序在设计上都有一些相似之处。 这些应用程序的打包通常由它们使用的框架&#xff08;如Spring&#xff0c;EJB或Hibernate等&#xff09;驱动。或者&#xff0c;您可以按功能对打包进行分组。 像任何其他有关建模的项目一样&#xff0c;这也…

error inflating class binaryXML LayoutParams addRule()

报出异常的原因是由于少添加了构造方法&#xff0c;三个构造方法需要写完整&#xff0c;不能只写一个。参数为(Context, AttributeSet)&#xff0c;其中第二个参数用来将xml文件中的属性初始化。 自定义控件若需要在xml文件中使用&#xff0c;就必须重写带如上两个参数的构造方…

AppD方法:Java 9支持

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

Java反射,但速度更快

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

Git时间

1、Git是目前世界上最先进的分布式版本控制系统。和集中式版本控制系统相比&#xff0c;分布式版本控制系统的安全性要高很多&#xff0c;因为每个人电脑里都有完整的版本库&#xff0c;某一个人的电脑坏掉了不要紧&#xff0c;随便从其他人那里复制一个就可以了。而集中式版本…

横、竖分割线

竖分割线&#xff1a; <View android:layout_width"0.5px" android:layout_height"120dp" android:background"#B8B8B8" android:visibility"visible" /> <!-- 竖直线 -->横分割线&#xff1a;<Viewandroid:layout…

java中update_Java 7 Update 21安全改进的详细信息

java中updateOracle昨天发布了三个Java更新 。 重要的是要注意它们包含一些与安全性相关的更改。 一段时间以来&#xff0c;这些变更中的大多数已经宣布&#xff0c;首先要注意的是Oracle按计划交付。 Oracle公司Java平台安全经理米尔顿史密斯&#xff08;Milton Smith&…

访问GitHub超慢的解决办法

是github某个CDN(Content Delivery Network&#xff0c;即内容分发网络?)被屏蔽所致。 附件--->记事本&#xff08;选择以管理员身份运行&#xff09;——文件——打开C:\Windows\System32\drivers\etc 右下角选择“所有文件” 选择hosts 打开 如图在这行下面添加绑定IP…

学习使用Whally GraalVM!

介绍 在Truffle在神圣的Graal中服务&#xff1a;Graal和Truffle在JVM上进行多语种语言解释的帖子中&#xff0c;我们得到了简短的介绍&#xff0c;并对Graal&#xff0c;Truffle及其周围的一些概念进行了深入研究。 但是&#xff0c;如果不深入研究实用性&#xff0c;那么任何技…

colos.xml

<?xml version"1.0" encoding"utf-8"?> <!-- /* //device/apps/common/assets/res/any/colors.xml ** ** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License");…