java - 当我只访问外键 ID 时,如何防止 Hibernate 获取连接的实体?

标签 java sql hibernate

我有一个连接到另一个的 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/

相关文章:

java - Ant foreach 避免空变量

java - 为什么空闲 Java 线程显示高 CPU 使用率?

java - 在 HQL 中使用内部连接的子查询

java - Hibernate/C3P0 没有正确关闭 MySQL 连接(在 mysql.err 上终止连接)

java - 如何在 playframework Java 上将 List<Object> 转换为 JSON

java - 异常 : Error creating bean with name 'richBean'

java - 如何在 Spring Data JPA 中编写具有多个可为空参数的查询?

mysql - 如何将简单的 SQL 请求转换为 Apache PIG 脚本?

mysql - 在 Play Framework/JPA/hibernate 中截断表?

java - JPA/Hibernate 连接查询