据我了解,该调用不应往返于数据库,因为Id存储在EntityA表中,并且代理应仅返回该值。
使用 属性访问类型 。您遇到的行为是字段访问类型的“限制”。这是Emmanuel Bernard的解释:
那是不幸的,但可以预料的。这是字段级别访问的限制之一。基本上,我们没有办法知道getId()实际上只能访问id字段。因此,为了安全起见,我们需要加载整个对象。
因此,将代码更改为:
@Entitypublic class EntityA { private EntityB parent; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") public EntityB getParent() { return parent; } ...}@MappedSuperclasspublic class SuperEntity { private long itemId; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") public long getItemId() { return itemId; } ...}参考文献
- 在字段上使用注释时,在getId-call上加载的代理
- proxy getId =>为什么生成sql!
- HHH-3718(如果可以解决此问题)



