Просто используйте FetchType.LAZY
.
public class MyEntity{
private int id;
@ManyToOne(fetch = FetchType.LAZY)
private MyOtherEntity other;
}
И тогда вы можете получить доступ к идентификатору через myEntity.getMyOtherEntity().getId();
Некоторое объяснение: если ленивая загрузка установлена для свойстваобъект, когда Hibernate загружает этот объект из БД, вместо создания соответствующего свойства Object и загрузки всех его свойств из своей собственной таблицы, вместо этого он создает «прокси» для этого объекта и сохраняет в нем только идентификатор.
Когда вы позже попытаетесь получить доступ к любому из свойств этого прокси-объекта в первый раз, он распознает, что объект не инициализирован, и действительно загружает объект.
Они обычно говорят, что объект будет загруженкогда вы получаете доступ к нему в первый раз.Но поле 'id' является исключением.Он уже присутствует в прокси-объекте!(Это вполне логично: чтобы загрузить всю сущность из БД, вам все равно нужен идентификатор).Так что, пока вы получаете доступ только к полю id, другие поля не будут загружены.(не будет доступа к таблице БД OtherEntity)
Несмотря на то, что создается прокси-объект, а в фоновом режиме происходит дополнительная магия JPA / гибернации, он по-прежнему является наиболее эффективным способом доступа к полю id.(Также, если позже вы добавите некоторые другие поля, они будут загружены автоматически)