Как я могу запретить получение 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)
);
Ответы
Ответ 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() { ... }
...
}