当我只访问外键id时,如何阻止Hibernate获取已连接的实体?

tea*_*bot 13 java sql 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;
}
Run Code Online (Sandbox Code Playgroud)

表:

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

CREATE TABLE parent (
    id int PRIMARY KEY,
    child_id int REFERENCES (child.id)
);
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 9

这是因为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() { ... }

    ...   
}
Run Code Online (Sandbox Code Playgroud)