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

时间:2016-06-23 11:26:29

标签: java jpa eclipselink

我有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映射获取外国实体字段是否有更好的方法?

  • JPA后端:EclipseLink 2.6.2

1 个答案:

答案 0 :(得分:1)

这不是JPA的目的。只需拨打user.getEmail()即可获得电子邮件,这是您最干净的选择。

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

如果您使用的是休眠,那么故事会有所不同。然后你可以使用@Formula注释。但它不会更高效。 Eclipselink并不喜欢它。