Разница между @LazyCollection (LazyCollectionOption.FALSE) и @OneToMany (fetch = FetchType.EAGER)

У меня есть одно сомнение по поводу "Ленивая загрузка". В чем разница между использованием @LazyCollection(LazyCollectionOption.FALSE) и @OneToMany(fetch = FetchType.EAGER)?

В моем приложении я использую два списка, но если я использую в этом формате:

@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;


@OneToMany(mappedBy = "consulta", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<Contato> contatos;

У меня есть эта ошибка:

Вызывается: org.hibernate.loader.MultipleBagFetchException: невозможно одновременно получить несколько пакетов

Я знаю, что это происходит потому, что Hibernate не позволяет мне загружать два списка одновременно. Но если я использую этот формат:

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consulta", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<Contato> contatos;

это работает отлично.

извините за мой английский спасибо

Ответ 1

Основное отличие аннотаций состоит в том, что @OneToMany и его параметры (например, fetch = FetchType.EAGER) являются чистым JPA. Он может использоваться с любым провайдером JPA, таким как Hibernate или EclipseLink.

@LazyCollection, с другой стороны, является Hibernate специфическим и, очевидно, работает только при использовании Hibernate.

Если возможно, старайтесь как можно больше придерживаться спецификации JPA. Делая это, вы должны иметь возможность легко переключаться с провайдера (по крайней мере теоретически).

Что касается вашей реальной проблемы, может быть, вы используете версию Hibernate, которая не поддерживает JPA 2.0, поскольку этот ответ предлагает?

Ответ 2

Думаю, у меня такая же проблема...

попробуйте все коллекции...

 @Fetch(FetchMode.SUBSELECT)

Он должен устранить ошибку

Ответ 3

Как предлагается в этом сообщении: fooobar.com/info/21623/... Изменение списка по набору должно решить исключение MultipleBagFetchException. Это помогло мне.