我有一个连接到另一个的 Hibernate 实体 Parent
:Child
。在数据库中,我有一列 parent.child_id
,它在 child.id
上有一个外键约束。假设我正在延迟加载,当我加载 Parent
的实例时,我希望能够访问 parent.getChild().getId()
而无需查找子
表。
我希望 parent.getChild()
返回的代理能够完成对 Child.getId()
的请求,因为它已经从parent.child_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() { ... }
...
}
关于java - 当我只访问外键 ID 时,如何防止 Hibernate 获取连接的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351713/