Разница между @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.
Это помогло мне.