Hibernate在访问关联实体的ID时生成SQL查询

我有Hibernate Entities,看起来像这样(getters和setters被忽略):

@Entity
public class EntityA {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private EntityB parent;
}

@Entity
public class EntityB extends SuperEntity {
    @OneToMany(mappedBy = "parent")
    @Fetch(FetchMode.SUBSELECT)
    @JoinColumn(name = "parent_id")
    private Set<EntityA> children;
}

@MappedSuperclass
public class SuperEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private long itemId;
}

当我查询EntityA时,它会正常加载,父关联被替换为Hibernate代理(因为它是Lazy)。 如果我想访问父母的ID,我执行以下调用:

EntityA entityA = queryForEntityA();
long parentId = entityA.getParent().getItemId();

据我所知,调用不应往返数据库,因为Id存储在EntityA表中,并且代理只应返回该值。 但是,在我的情况下,这会生成一个SQL语句,它提取EntityB,然后返回该Id。

我怎样才能调查这个问题? 这种不正确行为的可能原因是什么?


据我所知,调用不应往返数据库,因为Id存储在EntityA表中,并且代理只应返回该值。

使用属性访问类型 。 您遇到的行为是字段访问类型的“限制”。 这是Emmanuel Bernard如何解释它的:

这是不幸的,但预计。 这是现场级访问的限制之一。 基本上我们没有办法知道getId()确实只是去访问id字段。 所以我们需要加载整个对象才能安全。

所以把你的代码改成:

@Entity
public class EntityA {
    private EntityB parent;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    public EntityB getParent() {
        return parent; 
    }
    ...
}

@MappedSuperclass
public class SuperEntity {
    private long itemId;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public long getItemId() { 
        return itemId;
    }
    ...
}

相关问题

  • Hibernate注解 - 哪个更好,可以通过字段或属性访问?
  • 参考

  • 代理在字段上使用注释时加载到getId调用上
  • proxy getId =>为什么会产生sql!
  • HHH-3718(如果这个问题可以解决)

  • 你说什么是有道理的 - 它不会使数据库命中,因为EntityA包含父ID。 我只是不确定getParent()调用实际上是否加载了EntityB对象,无论您是否感兴趣的是ID。 如果要保存数据库命中,您可以尝试将子集(和其他任何字段)标记为Lazy。

    @Entity
    public class EntityB : SuperEntity {
        @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
        @Fetch(FetchMode.SUBSELECT)
        @JoinColumn(name = "parent_id")
        private Set<EntityA> children;
    }
    
    链接地址: http://www.djcxy.com/p/36999.html

    上一篇: Hibernate generating SQL queries when accessing associated entity's id

    下一篇: Hibernate InheritanceType.JOINED Criteria Projection sum