小编典典

当我仅访问外键ID时,如何防止Hibernate提取联接的实体?

hibernate

我有一个Parent连接到另一个的Hibernate实体:Child。在数据库中,我有一列parent.child_id在上具有外键约束child.id。假设我正在延迟加载,那么当我加载的实例时,Parent我希望能够在parent.getChild().getId()不引起child表查找的情况下进行访问。

我希望返回的代理parent.getChild()能够完成请求,Child.getId()因为它已经从parent.child_id列中加载了孩子的ID
。但是,我在child桌上看到另一个查询。

为什么需要这个额外的查询,我该如何避免呢?在这种情况下,我只对外键ID感兴趣,而不希望加载整个行。

类:

class Parent {
  @Id @Column(name = "id", unique = true, nullable = false)
  private Integer id;

  @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "child_id")
  private Child child;
}

class Child {
  @Id @Column(name = "id", unique = true, nullable = false)
  private Integer id;

  @Column(name = "name")
  private String name;
}

表格:

CREATE TABLE child (
    id int PRIMARY KEY,
    name varchar(10)
);

CREATE TABLE parent (
    id int PRIMARY KEY,
    child_id int REFERENCES (child.id)
);

阅读 246

收藏
2020-06-20

共1个答案

小编典典

这是由于Child使用字段访问(由于在字段上放置了注释)这一事实引起的,因此,当您调用任何一种方法时,Hibernate都会简单地初始化代理。

如果将注释移到属性,它将按预期工作。

从JPA 2.0(Hibernate 3.5)开始,您可以用细粒度的方式对其进行配置:

@Access(AccessType.FIELD) // Default is field access
class Child {
    private Integer id;

    @Column(name = "name")
    private String name;

    @Access(AccessType.PROPERTY) // Use property access for id
    @Id @Column(name = "id", unique = true, nullable = false)
    public Integer getId() { ... }

    ...   
}
2020-06-20