我正在使用带有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;
}
考虑到UserProfile
是Guest
类的减少这一事实,在UserProfile
类中保留User
类的最佳方式是什么?它是非持久性的吗?
答案 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中提取所需的列。