2014-09-23 8 views
11

Mam jedną wątpliwość co do "Lazy-loading". Jaka jest różnica między używaniem @LazyCollection(LazyCollectionOption.FALSE) i @OneToMany(fetch = FetchType.EAGER)?Różnica między @LazyCollection (LazyCollectionOption.FALSE) i @OneToMany (fetch = FetchType.EAGER)

Im moja aplikacja używam dwóch list, ale jeśli mogę użyć w tym formacie:

mam ten błąd:

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

wiem, czy to występujący ponieważ Hibernacja nie pozwala do załadowania dwóch list w tym samym czasie. Ale jeśli używam tego formatu:

@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; 

działa idealnie.

przepraszam za mój angielski dzięki

Odpowiedz

8

Podstawowa różnica między adnotacji, że @OneToMany i jego parametry (np fetch = FetchType.EAGER) jest czystym JPA. Może być używany z dowolnym dostawcą JPA, takim jak Hibernate lub EclipseLink.

@LazyCollection z drugiej strony jest specyficzny dla trybu hibernacji i oczywiście działa tylko w przypadku użycia hibernacji.

Jeśli to możliwe, staraj się trzymać specyfikacji WZP tak bardzo, jak to możliwe. W ten sposób powinieneś być w stanie łatwo zmienić dostawcę (przynajmniej teoretycznie).

Co do prawdziwego problemu, czy to możliwe, że używasz wersji Hibernuj, która nie obsługuje formatu JPA 2.0, ponieważ sugeruje odpowiedź this?

+0

Problem z 'FetchType.EAGER', który OP opisuje jest nadal w Hibernate w wersji 5.2. – holmis83

0

Myślę, że mam ten sam problem ...

przymierzyć wszystkich kolekcji ...

@Fetch(FetchMode.SUBSELECT) 

To powinno wyeliminować błąd