JPA Hibernate ::实体的继承,带有额外的OneToMany列表

时间:2016-07-21 10:47:33

标签: java mysql spring hibernate jpa

我正在使用JPA Hibernate / Spring启动来构建一个带有MySQL数据库的Web服务器,我正在尝试使用额外的OneToMany列表扩展一个看起来像这样的POJO实体。

@Entity
@Table(name="user")
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable=false)
    private String name;

     ....Constructors, getters and setters....
}

使用这个基本的用户实体,我只想创建一个UserInfo实体,其中包含有关用户职业生涯的其他信息。

@Entity
public class UserInfo extends User {

    @OneToMany(cascade= CascadeType.ALL, fetch= FetchType.EAGER)
    @JoinColumn(name="user_id", referencedColumnName = "id")
    private List<Career> careers;

     ....Constructors, getters, setters......
}

我很困惑我应该选择哪种继承策略。我不认为有必要为此制作另一个专栏或表格。 或者我应该只查询两次..?

我是JPA的新手,所以不确定哪种被认为是最佳做法或设计......

修改

这就是Career实体的样子。以防万一......

@Entity
@Table(name="career")
public class Career {
    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable=false)
    private Integer user_id;

    @Column(nullable=false)
    private String name;

    @Column(nullable=false)
    private String description;

     ....Constructors, getters and setters....
}

由于扩展User表毫无意义(仅在我的情况下),我改变了User类。

@Table(name="user")
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable=false)
    private String name;

    @OneToMany(fetch= FetchType.LAZY)
    @JoinColumn(name="user_id", referencedColumnName = "id")
    private List<Career> careers;

     ....Constructors, getters, setters......

}

现在我正在尝试使用Spring Data JPA,当我尝试用他们的职业显示用户列表时,它现在查询超过40次需要大约一分钟来显示结果。

这是N + 1问题吗?我怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

在我看来,错误在于模型本身。为什么UserInfo会延长User?我无法想象UserInfo应该从User继承哪些属性或方法。典型的继承是“开发人员”或“管理员”。

为什么不在UserInfo实体中添加User作为1:1关系?另一种选择是省略UserInfo并将Career s作为1:n关系直接放入User

为了防止越来越多的Careers出现可能的n + 1问题,您可能希望更改提取模式。见下文

@OneToMany(fetch=FetchType.LAZY,mappedBy="user")
@Fetch(FetchMode.SUBSELECT)
private Set<Career> careers = new HashSet<>();