我正在做一些个人项目,但是我有一个关于休眠的问题。
我有一个像这样的类结构:
@Entity
public class User {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fkIdCompanyUser")
private Company company = new Company();
}
但是在公司内部,我又加入了。
@Entity
public class Company {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fkIdCompanyEstimateOption")
private EstimateOptions estimateOptions = new EstimateOptions();
}
现在,我进行查询以获取估计选项。
但是如果我这样做的话,它会装载很多不必要的东西。
@RequestMapping(value = "/estimateoptions")
public EstimateOptions getCompanyEstimateOptions(@AuthenticationPrincipal Principal user) {
User getuser = userDao.findByEmail(user.getName());
EstimateOptions estimateOptions = getuser.getCompany().getEstimateOptions();
return estimateOptions;
}
有更好的方法吗?
最佳答案
有很多方法可以进行这种优化。最简单的方法是通过延迟加载将双向关联添加到Company
和EstimateOptions
。Company
的示例(我不测试。这只是一个草图。)
@Entity
public class Company {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fkIdCompanyEstimateOption")
private EstimateOptions estimateOptions = new EstimateOptions();
@OneToOne(mappedBy="company", fetch = FetchType.LAZY)
private User user;
}
并执行类似的操作(这是HQL,但您也可以使用条件API)
from EstimateOptions options inner join options.company company inner join company.user user where user.name = :userName
您可以查看HQL joined query to eager fetch a large number of relationships以获得其他想法。
更新
我不确定,但也许您可以执行类似的操作(无需其他关联)
select options from User user inner join user.company company inner join company.estimateOptions options where user.name = :userName