弱投影模型_通过投影增强数据模型
弱投影模型
介绍
数据模型可能很棘手。 建模可能会更加困难。 有时候,应该放入数据库表中的信息不一定是我们要在每段代码中使用的信息。
和其他许多次一样,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
弱投影模型
弱投影模型_通过投影增强数据模型相关推荐
- 摄像机投射投影模型_综述及详解
1.写在前面的话 摄像机通过成像透镜将三维场景投影到摄像机二维像平面上,这个投影可以用成像变换进行表示,也就是我们平常说的摄像机投影模型.摄像机成像模型有不同的描述方式.这里仅仅总结了机器视觉中常用的 ...
- 投影仪投影技术_激光投影仪和灯泡投影仪如何工作,哪个适合您?
投影仪投影技术 There are a few things to consider when buying your first projector. Price range and the spa ...
- 【鱼眼相机模型】鱼眼相机投影模型理解
一.从普通镜头到鱼眼镜头 如图1所示,普通镜头下的光线依据针孔相机模型进行成像(该部分可参考相机投影关系).但该模型存在一个缺陷:相机视野范围越大,所需的成像平面也越大,当相机视野范围要求在180°时 ...
- 各种经典透镜投影模型
各种经典透镜投影模型 Models for the various classical lens projections 鱼眼镜片与其他镜片同等重要 where fisheye lenses are ...
- 图像凸集投影法_论文分享|数字投影结构光三维测量方法研究
温馨提示:本文约5600字,阅读全文需约10分钟. 文末福利:按照文末提示操作,输入关键词可获取论文全文. 摘要 人类所处的物理世界空间是三维的,任何实物都以三维的方式呈现.随着社会的进步发展,三维信 ...
- 相机模型:opengl投影 vs 小孔成像
相机模型:opengl投影 vs 小孔成像 一级目录 相机投影方式 Perspective Projection 对应小孔成像 小孔成像 opengl near-far-plane lookup ma ...
- 圆柱体的投影特点_环形屏幕投影技术的特点和优势
近年来,随着投影技术的不断创新和发展,它逐渐成熟和完善.它突破了传统的单一投影仪和窗帘的投影方式,可以达到越来越多的科幻投影显示效果,给人们的生活增添更多的色彩.全息投影.交互式投影.立体投影.投影融 ...
- c#垂直投影法_投影学
投影学 题解:本文命名<投影学>,是由于本文讨论投影的一些最基础的问题. 1 投影法 1.1投影的基本概念 投影,是一种通过降维的方法在平面上表示空间形体的办法.在工程上,投影是一种光线照 ...
- 我国常用的投影坐标系_我国常用坐标系和高程系详解
北京54坐标系(BJZ54) 北京54坐标系为参心大地坐标系,大地上的一点可用经度L54.纬度M54和大地高H54定位,它是以克拉索夫斯基椭球为基础,经局部平差后产生的坐标系. 新中国成立以后,我国大 ...
最新文章
- 多实例gpu_MIG技术快速提高AI生产率
- 不生成新数组的迭代器方法:forEach()every()some()reduce()reduceRight()
- [译]ASP.NET Core 2.0 机密配置项
- 干货!一次kafka卡顿事故排查过程
- oracle control file文件 详解
- Android M App休眠 (adb shell dumpsys usagestats)
- Flume-NG源码阅读之AvroSink
- python 数据库模块
- Adobe 2022软件安装错误代码107解决办法
- Oracle行迁移和行链接
- Expression Blend学习5控件
- CentOS7安装python3.6.6(解决所有安装异常情况!!!)
- 第五章 循环结构课后思考
- 解决微信二次分享失败
- 网络防火墙开发二三事 转
- oracel vm 安装windows server 2012报错Error 0x000000C4
- 企业微信最全17种获客+4种自动转化玩法
- 论文阅读问题总结(六):Meta-Learning with Domain Adaption for Few-shot Learning Under Domain Shift
- 解决password自动填充问题
- Mac—删除默认英文输入法