繁体   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