Как объявить Int как внешний ключ в Java Spring Boot - PullRequest
0 голосов
/ 03 октября 2018

Так что по умолчанию это так:

public class MyEntity{

   private int id;

   @OneToOneOrWhatever
   private MyOtherEntity other;

}

Вы можете создать отношение, просто добавив к нему объект.Но в моем случае загрузка всего объекта с энергичной загрузкой была бы просто излишней.Я просто хочу получить идентификатор «MyOtherEntity», ничего больше.Возможно ли что-то вроде этого:

public class MyEntity{

    private int id;

   @SomeFancyAnnotationToRelateTo(MyOtherEntity.class)
   private int foreignKeyId;

}

возможно?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Просто используйте 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.(Также, если позже вы добавите некоторые другие поля, они будут загружены автоматически)

0 голосов
/ 03 октября 2018

Это может сделать это.

public class MyEntity{
    private int id;

    @OneToOne(fetch = FetchType.LAZY)
    @Fetch(FetchMode.JOIN)
    @JoinColumn(name = "myTypeId")
    private MyType myType;

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