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

我有一个Hibernate实体Parent加入另一个: 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) ); 

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