Hibernte 1:n 最佳抓取策略
Hibernte 1:n 最佳抓取策略
在orm中实体1:n关联时,要考虑两个问题,分别是经典的n+1问题,和笛卡尔积问题。所以要避免使用默认抓取策略,同时尽量减少结果。hibernate作为最主流的java orm。一般的的优化原则是使用batchsize减少子查询的sql数量,同时在one一端使用懒加载,并且用subselect或者join来代替默认的关联加载。
上代码:
@Entity
@BatchSize(size=10)//因为一般要获得post,都会调用creator,所以使用预抓(EAGER)策略,同事设置预抓持为10
public class User extends BaseEntity{
@Id @GeneratedValue
@Column(name="id")
private long id;
@OneToMany(mappedBy="creator",fetch=FetchType.LAZY)//懒加载
@Fetch(FetchMode.SUBSELECT)//使用JOIN会产生笛卡尔积的问题,subselect策略是Hibernate.org推荐的解决N+1问题策略
private Set
......
}
@Entity
public class Post extends BaseEntity {
@Id @GeneratedValue
@Column(name="id")
private long id;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(nullable=false)
private User creator;
....
}