使用 JPA 从外国实体获得一定的价值
Getting certain value from the foreign entity using JPA
我有 2 个实体 User 和 Profile,其中一个用户有一个配置文件。
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 实体映射,棘手的事情
这里是个人资料包括用户的电子邮件(不是整个用户的实体),但不应由个人资料更新或存储,因此电子邮件是 foreign 用户实体的只读属性。
我使用以下配置文件的实体映射来获取用户的电子邮件:
@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 映射获取外部实体字段是否有更好的方法?
- JPA 后端:EclipseLink 2.6.2
这并不是 JPA 真正设计的目的。仅通过调用 user.getEmail()
获取电子邮件是您拥有的最干净的选择。
您不必太担心加载整个用户;我认为它是一个单一的连接,JPA 应该为你做。性能影响应该是最小的。 (您可以简单地不公开内部用户对象,以免过多影响您的对象设计。使用 JPA 时,您总是会限制您的 OO 设计选项)。
如果您使用的是 hibernate,情况就会有所不同。然后你可以使用 @Formula
注释。不过,它的性能不会更高。 Eclipselink 没有类似的东西。
我有 2 个实体 User 和 Profile,其中一个用户有一个配置文件。
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 实体映射,棘手的事情 这里是个人资料包括用户的电子邮件(不是整个用户的实体),但不应由个人资料更新或存储,因此电子邮件是 foreign 用户实体的只读属性。
我使用以下配置文件的实体映射来获取用户的电子邮件:
@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 映射获取外部实体字段是否有更好的方法?
- JPA 后端:EclipseLink 2.6.2
这并不是 JPA 真正设计的目的。仅通过调用 user.getEmail()
获取电子邮件是您拥有的最干净的选择。
您不必太担心加载整个用户;我认为它是一个单一的连接,JPA 应该为你做。性能影响应该是最小的。 (您可以简单地不公开内部用户对象,以免过多影响您的对象设计。使用 JPA 时,您总是会限制您的 OO 设计选项)。
如果您使用的是 hibernate,情况就会有所不同。然后你可以使用 @Formula
注释。不过,它的性能不会更高。 Eclipselink 没有类似的东西。