Подтвердить что ты не робот

Как я могу запретить получение Hibernate подключенных объектов, когда я получаю доступ только к идентификатору внешнего ключа?

У меня есть объект Hibernate Parent, который соединен с другим: Child. В базе данных у меня есть столбец parent.child_id, который имеет ограничение внешнего ключа на child.id. Предполагая, что я лениво загружаю, когда я загружаю экземпляр Parent, я ожидаю, что смогу получить доступ к parent.getChild().getId() без поиска в таблице Child.

Я ожидал, что прокси, возвращаемый parent.getChild(), сможет выполнить запрос Child.getId(), поскольку он уже загрузил дочерний идентификатор из столбца parent.child_id. Однако я вижу дополнительный запрос в таблице Child.

Почему этот дополнительный запрос необходим, и как я могу его избежать? В этом случае меня интересует только идентификатор внешнего ключа и не хочу загружать всю строку.

Классы:

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)
);
4b9b3361

Ответ 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() { ... }

    ...   
}