繁体   English   中英

JPA Hibernate ::实体的继承,以及其他OneToMany列表

[英]JPA Hibernate :: Inheritance of an entity, with additional OneToMany Lists

我正在使用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的新手,所以不确定将其视为最佳实践或设计。

编辑

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

@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问题吗? 我该如何解决?

我认为错误在于模型本身内。 为什么UserInfo扩展User 我无法想象UserInfo应该从User继承哪些属性或方法。 典型的继承是“开发人员”或“管理员”。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM