使用 JPA 从外国实体获得一定的价值

Getting certain value from the foreign entity using JPA

我有 2 个实体 UserProfile,其中一个用户有一个配置文件。

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 真正设计的目的。仅通过调用 user.getEmail() 获取电子邮件是您拥有的最干净的选择。

您不必太担心加载整个用户;我认为它是一个单一的连接,JPA 应该为你做。性能影响应该是最小的。 (您可以简单地不公开内部用户对象,以免过多影响您的对象设计。使用 JPA 时,您总是会限制您的 OO 设计选项)。

如果您使用的是 hibernate,情况就会有所不同。然后你可以使用 @Formula 注释。不过,它的性能不会更高。 Eclipselink 没有类似的东西。