【问题标题】:Spring Data JPA - how to set transient fields after retrievalSpring Data JPA - 如何在检索后设置瞬态字段
【发布时间】:2016-09-17 09:30:15
【问题描述】:

使用 Spring Data JPA 的 JpaRepository 方法获取实体后,例如findOnefindBy... 等,我想知道自动执行一些自定义代码的最佳方法是什么,比如初始化一些瞬态字段。

换句话说,假设我有一个带有fullName 瞬态字段的User 实体,从数据库中获取后应该将其设置为firstNamelastName 的串联,我该怎么办?

【问题讨论】:

    标签: spring hibernate jpa spring-data spring-data-jpa


    【解决方案1】:

    首先,如果您想要全名,只需编写一个动态连接名字/姓氏的方法。它不一定是一个字段。

    如果您确实需要对实体加载进行一些处理,请注册@PostLoad 实体生命周期回调:

    public class MyEntity{
    
         @PostLoad
         //invoked by framework on entity load.
         public void doStuff(){
             fullName =  forename + " " + surname;   
         }
    
         //alternative
         public String getFullName(){
             return forename + " " + surname;
         }
    

    https://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Example_of_Entity_event_annotations

    【讨论】:

    • 谢谢,@PostLoad 运行良好。 fullName 只是一个例子——我会用它来进行更冗长的初始化。
    【解决方案2】:

    您可以使用@Access(AccessType.Property) 理想地设置瞬态字段。

    您必须在setter方法中正常提及@Access(AccessType.Property),然后您才能在该setter方法中设置该瞬态字段的值。

    或者,如果是存储库,你可以很好地写一个JPQL 类似的东西。

    @Query("SELECT new Hello(a.x*a.y,a.x,a.y)FROM Hello a WHERE t.value = :value")

    然后在构造函数中将这个transient variable的值设置为a.x*a.y

    【讨论】:

      【解决方案3】:

      我自己没有尝试过,但似乎@PostLoad 注释可以帮助您在从数据库中检索业务对象后执行代码以更改其状态。

      但在您的具体情况下,我将简单地创建一个连接 firstName 和 secondName 的方法 getFullName 而不将值存储在 bean 中。

      【讨论】:

        猜你喜欢
        • 2018-03-27
        • 2013-09-03
        • 1970-01-01
        • 1970-01-01
        • 2016-01-28
        • 2018-09-23
        • 2014-01-08
        • 2018-07-25
        • 1970-01-01
        相关资源
        最近更新 更多