java - 使用 JPA 从外国实体获取一定的值(value)

标签 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;
}

所以问题是关于配置文件实体映射,这是一件棘手的事情 这里的配置文件包含用户的电子邮件(不是整个用户的实体),但它不应该由配置文件更新或存储,因此电子邮件是来自外部用户实体的只读属性。

我使用以下配置文件的实体映射来获取用户的电子邮件:

@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/

相关文章:

JPA 到 JAXB 问题

jpa - 如何知道 EclipseLink 实体是否已分离?

java - 使用与 Eclipse 中的其他版本不同的编译器合规性版本来编译类

java - 为什么我无法重用InputStream?

java - 如何在 Log4j 的静态方法中实例化记录器(对于大型项目)?

java - Hibernate:双向 ManyToOne 映射 - 逆关系不起作用

java - 自版本 4.3.2 以来未映射 hibernate 实体

java - eclipselink (JPA) 异常 : composite primary key @JoinColumn

java - 重力和错误的尺寸

java - 当我尝试删除对象时,Hibernate : org. hibernate.WrongClassException