弱投影模型_通过投影增强数据模型
弱投影模型
介紹
數(shù)據(jù)模型可能很棘手。 建模可能會更加困難。 有時候,應該放入數(shù)據(jù)庫表中的信息不一定是我們要在每段代碼中使用的信息。
和其他許多次一樣,Spring來了。 一個稱為投影的小功能可以幫助我們在普通界面中僅用幾行數(shù)據(jù)映射數(shù)據(jù)。
在本文中,我們將看到一個有關如何使用投影的簡單示例。
基礎
好的,讓我們設置場景。 假設我們有以下實體:
@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為我們提供了一種很好的聲明方式,表明我們需要:
- 一個不錯的生成器接口來創(chuàng)建bean( @Builder )
- 獲取器和設置器( @Data )
- 默認構造函數(shù)( @NoArgsConstructor )
- 一個帶有所有字段參數(shù)的構造函數(shù)( @AllArgsConstructor )
- equals()和hashCode() ,但是請使用字段,而不是getters( @EqualsAndHashCode(doNotUseGetters = true) )
- toString() ; 再次使用字段( @ToString(doNotUseGetter = true) )
其余的注釋( @Entity和@Table )是舊的JPA。
是的,所以,我們有一個很好的實體。 怎么了
以傳統(tǒng)方式獲取數(shù)據(jù)
讓我們看一下這個存儲庫:
@Repository public interface UserRepository extends JpaRepository<User, Long> {}上面的代碼為我們提供了最少的CRUD方法集。 一個是getOne(Long id) 。 好,不是嗎?
好吧,正確的答案必須是:這取決于! 為什么? 因為這將返回整個實體,包括鹽和哈希密碼。 這是非常敏感的信息。 特別是鹽永遠不應該被外界吸收。
為了從生成的實體中獲取此信息,我們將不得不做大量的手工工作。 只是從我的頭開始,我們應該:*創(chuàng)建一個新bean *實現(xiàn)一個映射器以從我們的實體獲取到該新bean *確保每次我們處理該實體時,我們都將其映射*在實現(xiàn)該實體時會感到頭疼也可能有多種結果。
退還最低要求
值得慶幸的是,Spring可以確保這一天的安全。 一個叫做Projections的小功能讓我們以聲明的方式定義映射。 這樣的接口看起來像這樣:
public interface UserProjection {@Value("#{target.getUsername()}")String getUsername();@Value("#{target.getFirstName()}")String getFirstName();@Value("#{target.getLastName()}")String getLastName(); }Spring將用我們當前正在處理的實體替換target 。 換句話說, target將是User的實例。
我們現(xiàn)在要做的唯一的事情是這樣的:
@Repository public interface UserRepository extends JpaRepository<User, Long> {UserProjection findById(Long id);List<UserProjection> findAllUser(); }現(xiàn)在,每次調(diào)用findById() ,我們都會獲得UserProjection的實例。 我們的鹽或密碼哈希不能泄漏! 更好的是,我們可以對具有多個結果的方法使用相同的過程。
結論
使用Spring Projections,我們可以節(jié)省很多代碼和麻煩。 @Value()定義可以根據(jù)需要變得復雜。 例如,在我當前的項目中,當我們將“有趣的”舊數(shù)據(jù)庫設計映射到更簡單的數(shù)據(jù)模型中時,這為我的團隊節(jié)省了很多樣板代碼。
如果您想嘗試一下,可以在GitHub上找到一個簡單的示例應用程序。
翻譯自: https://www.javacodegeeks.com/2018/01/power-data-model-projections.html
弱投影模型
總結
以上是生活随笔為你收集整理的弱投影模型_通过投影增强数据模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么模拟器很老电脑(电脑上什么模拟器比较
- 下一篇: 绝地求生win10系统更新后提示无法创建