我正在做一些个人项目,但是我有一个关于休眠的问题。

我有一个像这样的类结构:

@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;
}


有更好的方法吗?

最佳答案

有很多方法可以进行这种优化。最简单的方法是通过延迟加载将双向关联添加到CompanyEstimateOptions
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

09-10 02:32
查看更多