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

У меня есть спящий объект 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)
);

1 Ответ

9 голосов
/ 18 марта 2011

Это связано с тем, что 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() { ... }

    ...   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...