gpt4 book ai didi

java - JPA Hibernate::实体的继承,带有附加的 OneToMany 列表

转载 作者:行者123 更新时间:2023-11-29 20:43:58 25 4
gpt4 key购买 nike

我正在使用 JPA Hibernate/Spring boot 构建一个带有 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 中。

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

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

关于java - JPA Hibernate::实体的继承,带有附加的 OneToMany 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38502186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com