2014-09-23 2 views
11

У меня есть одно сомнение относительно «Lazy-loading». В чем разница между использованием @LazyCollection(LazyCollectionOption.FALSE) и @OneToMany(fetch = FetchType.EAGER)?Разница между @LazyCollection (LazyCollectionOption.FALSE) и @OneToMany (fetch = FetchType.EAGER)

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

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

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Я знаю, если это происходит потому, что 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; 

работа совершенно.

извините за мой английский благодаря

ответ

8

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

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

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

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

+0

Проблема с 'FetchType.EAGER', которая описана в OP, все еще находится в Hibernate версии 5.2. – holmis83

0

Я думаю, что я получил эту же проблему ...

попробовать на все коллекции ...

@Fetch(FetchMode.SUBSELECT) 

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

Смежные вопросы