我有 2 个实体用户和个人资料,其中一个用户有一个个人资料。
User
实体映射非常清晰,如下所示:
@Entity
public class User {
@Id
private String id;
@Column(unique = true, nullable = false)
private String email;
@Column(unique = true, nullable = false)
private String name;
}
所以问题是关于配置文件实体映射,这是一件棘手的事情 这里的配置文件包含用户的电子邮件(不是整个用户的实体),但它不应该由配置文件更新或存储,因此电子邮件是来自外部用户实体的只读属性。
我使用以下配置文件的实体映射来获取用户的电子邮件:
@Entity
public class Profile {
@Id
private String userId;
@PrimaryKeyJoinColumn
private User user;
@Basic
private String firstName;
@Basic
private String lastName;
// ...
public String getEmail() {
return user.getEmail();
}
}
所以我决定加入整个实体并将工作委托(delegate)给它。
据我了解,不可能将 @JoinColumn
与 @Column
结合使用,如下所示:
@OneToOne
@JoinColumn(name = "userId", insertable = false, updatable = false)
@Column(name = "email")
private String email;
我也不确定是否使用@SecondaryTable
,因为它似乎是为不同的目的而设计的。
是否有更好的方法使用 JPA 映射获取外部实体字段?
- JPA 后端:EclipseLink 2.6.2
最佳答案
这并不是 JPA 的真正设计目的。只需调用 user.getEmail()
即可获取电子邮件,这是您拥有的最干净的选择。
您不必太担心加载整个用户;在我看来,这是一个单一的连接,JPA 应该为你做这件事。对性能的影响应该是最小的。 (您可以简单地不公开内部用户对象,以免对您的对象设计产生太大影响。尽管使用 JPA 时,您总是会限制您的 OO 设计选项)。
如果您使用 hibernate,情况就会有所不同。然后您可以使用@Formula
注释。但它的性能不会更高。 Eclipselink 没有类似的东西。
关于java - 使用 JPA 从外国实体获取一定的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37990287/