单表的两个版本的JPA实体

时间:2014-10-03 06:46:48

标签: java sql hibernate jpa

您好如何为单个表格获得两个JPA实体。

我正在尝试使用任何联接(对于列表页面)实现一个更轻的版本。 和所有映射的一个更重的版本(For View Details Page)。

例如,实体可以是“用户”,其中“列表”页面仅显示“用户表”中的记录,单击“用户名”将显示其他用户详细信息,其中它从其他映射实体(如“首选项”等)中获取记录。

1 个答案:

答案 0 :(得分:0)

看看下面的实体:

@Entity
public class Person {
    @Id
    private int id;

    private int age;

    private String name;

    @OneToMany
    private Set<Email> emailSet;

    @ManyToMany
    private Set<Person> childrenSet;

    // get and set
}

在上面的实体中,可以看到具有两个集合的实体。如果您运行下面的JPQL,则不会加载这些实体。

select p from Person p where p.id = 33
// or 
select p from Person p where p.name = 'uaiHebert'

为什么呢?所有具有&#39; 许多&#39;的实体注释(@OneToMany或@ManyToMany)将被延迟加载。

什么是懒加载?延迟加载意味着在您使用该属性之前不会从数据库加载该属性。在上面的实体中,只有在调用person.getEmailSet()时才会加载电子邮件。

您不需要其他实体来加快数据库加载速度,您需要在没有EAGER关系的情况下使用JPA。

如果您设置如下所示的emailSet,则每次加载人员时,其emailSet也会被加载。

    @OneToMany(fetch = FetchType.EAGER)
    private Set<Email> emailSet;

注意错误LazyInitializationException,即如果在事务关闭时调用person.getEmailSet()。有关此例外的详细信息,请查看以下链接:http://uaihebert.com/four-solutions-to-the-lazyinitializationexception/