我正在使用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问题吗?我怎么解决这个问题?
答案 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<>();