Hibernate: ленивый набор полей сущности

Мне интересно, возможно ли ленивое поле объекта. Рассмотрим этот фрагмент кода:

@Entity
@Getter
@Setter
@AllArgsConstructor
public class Foo{
    @ManyToOne
    @JoinColumn(name = "BAR_ID")
    private Bar bar'
}



@Component
public class FooAssembler{
       @Autowired
       private BarRepository barRepository;

       public Foo toFoo(Long barId){
          return new Foo(barRepository.getOne(barId))
       }
}

За кулисами у нас есть сущность с именем Bar и BarRepository. Теперь я не хочу извлекать Bar из репо. Я хочу использовать только свой аргумент barId и не беспокоить мою базу данных другой выборкой. Это вообще выполнимо?

Если вы вообще не хотите получать его, создайте конструктор Bar, который берет идентификатор и устанавливает его внутренне. тогда вы можете сделать return new Foo(new Bar(barId));, который звучит так, как вы хотите. Если вам не нужен дополнительный конструктор, просто создайте новый экземпляр Bar и установите для него идентификатор.

XtremeBaumer 11.04.2018 13:28

Пожалуйста, добавьте аннотацию типа выборки, что вы можете получать только родительскую запись ManyToOne(fetch = FetchType.LAZY)

Deedar Ali Brohi 11.04.2018 14:37

@XtremeBaumer - разве это не будет проблемой при более сложных операциях сохранения (я имею в виду каскадное сохранение)?

pokemzok 11.04.2018 15:07

@Deedar Ali Brohi - я добавил, но ничего не изменилось (Bar все еще извлекается из репо)

pokemzok 11.04.2018 15:08

Не должно вызывать проблем. Вы можете протестировать его и сообщить, если у вас возникнут какие-либо ошибки.

XtremeBaumer 11.04.2018 15:10
0
5
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение:

@Component
public class FooAssembler{
       @PersistenceContext
       private EntityManager em;

       public Foo toFoo(Long barId){
          return new Foo(em.getReference(Bar.class, barId))
       }
}

Благодаря EntityManager я могу создать прокси (как это делает Hibernate), который я могу использовать вместо получения реального объекта.

Другие вопросы по теме