我正在使用休眠模式,并且我拥有这些实体(出于保密原因,我无法发布真实实体):
EntityOne
pay_code
number
pay_code_number => primary key
EntityTwo
pay_code => primary key
number => primary key
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="pay_code", referencedColumnName="pay_code", insertable=false, updatable=false),
@JoinColumn(name="number", referencedColumnName="number", insertable=false, updatable=false)})
EntityOne entityOne;
EntityThree
id
pay_code_number => primary key
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="pay_code_number", insertable=false, updatable=false)
EntityOne entityOne;
当我从EntityThree et join中进行选择时,eetching.entityOne工作正常,不再进行选择。
但是当我从EntityTwo et join fetch et.entityOne中进行选择时,似乎没有完成,这导致sub select和我有两个选择需要很长时间...如果我看生成的sql我可以看到所有字段从select子句中的entityOne和entityTwo中获取,因此对我来说,休眠状态可以加载实体而无需将另一个选择发送到数据库。但我不知道他为什么不这样做。
差异在连接列上,因为EntityThree在primaryKey上进行连接,而EntityTwo在不是EntityOne的主键的列上进行连接。 我认为这是因为休眠尝试通过主键查找实体,而由于之前介绍的连接列而找不到它。
第一个解决方案是对联接进行重做,以在entityTwo中拥有一个pay_code_number,并在此列上执行联接,但是在此解决方案和更改太多事情之前,我在这里问是否有人可以帮助我避免这种重做。也许使用FormulaJoinColumn或其他方式?
多谢