我有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;
}
所以问题是关于Profile实体映射,这是棘手的事情 这里的配置文件包括用户的电子邮件(不是整个用户的实体),但它不应该由Profile更新或存储,因此该电子邮件是外部用户实体的readonly属性。
我使用以下个人资料的实体映射来获取用户的电子邮件:
@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();
}
}
所以我决定加入整个实体并将工作委托给它。
据我所知,不可能像@JoinColumn
一样使用@Column
:
@OneToOne
@JoinColumn(name = "userId", insertable = false, updatable = false)
@Column(name = "email")
private String email;
我也不确定使用@SecondaryTable
,因为它似乎是为了不同目的而设计的。
使用JPA映射获取外国实体字段是否有更好的方法?
答案 0 :(得分:1)
这不是JPA的目的。只需拨打user.getEmail()
即可获得电子邮件,这是您最干净的选择。
你不应该担心加载整个用户;我认为这是一个单一的连接,JPA应该为你做。性能影响应该是最小的。 (你可以简单地公开内部用户对象,不要过多地影响你的对象设计。使用JPA时,你总是限制你的OO设计选项。)
如果您使用的是休眠,那么故事会有所不同。然后你可以使用@Formula
注释。但它不会更高效。 Eclipselink并不喜欢它。