簡體   English   中英

Spring JPA-聯接非持久字段

[英]Spring JPA - Joining non-persistent fields

我正在將Spring Boot Web與JPA一起使用,以便開發事件計划應用程序。 目前,我正在開發公共用戶配置文件功能,並且在設計該功能時需要幫助,因為我不確定加入非持久字段的最佳方法。

用戶類:

@Entity
@Table(name = "users")
public class User extends BaseEntity {

    @Column(name = "name")
    private String name;

    @Column(name = "email", unique = true)
    private String email;

    @Column(name = "profile_picture")
    private String profilePicture;

    @Column(name = "facebook_token")
    private String facebookToken;

    other fields, method, and private data...
}

UserProfile類:

public class UserProfile {

    private final String name;
    private final String email;
    private final String profilePicture;

    ...
}

訪客類:

@Entity
@Table(name = "guests")
public class Guest extends BaseEntity {


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "event_id")
    private Event event;

    @Column(name = "status")
    private String status;

    @Column(name = "is_attending")
    private boolean isAttending;
}

考慮到UserProfileUser類的簡化,並且是非持久性的,將UserProfile類保留在Guest類中的最佳方法是什么?

您不能在JPA中將非實體作為關系,因為JPA不了解UserProfile。

一種解決方案是將UserProfile作為User的基類,然后將UserProfile和具有@Inheritence的用戶映射起來。

然后,您可以在Guest和UserProfile之間保持持久關系

您可以使用Embedded類將UserProfile保留在Guest類中,但這將是持久性的。如果希望UserProfile所有屬性都是非持久性的,則必須在其每個屬性上添加@Transient

我無法弄清為什么您將需要誠實地做到這一點。 無論如何,您都將執行以下操作,但這是一個不好的做法,因為您將DTO放置在Entity而不是相反的對象中:

@Transient UserProfile userProfile;

為什么不懶惰地與用戶加入來賓呢? 或者使用來賓和用戶從UserProfile繼承的繼承關系。

另一個選擇是簡單地使UserProfile成為只讀視圖,該視圖僅從User獲取所需的列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM