[英]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;
}
考虑到UserProfile
是User
类的简化,并且是非持久性的,将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.