Spring JPA - 加入非持久字段

时间:2016-02-27 15:01:34

标签: java spring hibernate jpa spring-boot

我正在使用带有JPA的Spring Boot Web,以开发一个事件计划应用程序。 目前,我正在开发公共用户配置文件功能,我需要帮助设计它,因为我不确定加入非持久字段的最佳方式。

用户类:

@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;
}

考虑到UserProfileGuest类的减少这一事实,在UserProfile类中保留User类的最佳方式是什么?它是非持久性的吗?

3 个答案:

答案 0 :(得分:0)

您不能将非实体作为JPA中的关系,因为JPA不了解UserProfile。

一种解决方案可能是将UserProfile作为User的基类,然后使用@Inheritence对UserProfile和User进行mapp。

然后,您可以在Guest和UserProfile

之间建立持久关系

答案 1 :(得分:0)

您可以使用Embedded类在UserProfile类中保留Guest,但它将是presistent。如果您希望UserProfile的所有属性都是非持久性的,则必须添加@Transient到它的每个属性。

答案 2 :(得分:0)

我无法弄清楚为什么你需要诚实地做到这一点。 无论如何你只需要执行以下操作,但这是一个不好的做法,因为你将DTO放在实体中而不是相反:

@Transient UserProfile userProfile;

为什么不懒得加入Guest和User?或者如其他人所述,使用Guest和User的UserProfile继承。

另一种选择是简单地将UserProfile设置为只读视图,该视图仅从User中提取所需的列。