通过投影增强数据模型
介紹
數據模型可能很棘手。 建模可能會更加困難。 有時候,應該放入數據庫表中的信息不一定是我們要在每段代碼中使用的信息。
和其他許多次一樣,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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的通过投影增强数据模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永久关闭电脑弹窗广告的3个方法如何关闭电
- 下一篇: Java 9:对可选的增强