2015-08-06 13 views
5

Mam podmiot zawierający List że w ten sposób lazy załadowany domyślnie:Jak wymusić ładowanie za pomocą CrudRepository w danych źródłowych?

interface MyEntityRepository extends CrudRepository<MyEntity, Long> { 

} 

@Entity 
public class MyEntity { 
    @Id 
    private Long id; 

    @OneToMany(mappedBy = "bar") //lazy by default 
    private List<Bar> bars; 
} 

@Entity 
public class Bar { 
    //some more 
} 

Pytanie: Jak mogę zmusić zachłanne ładowanie podczas wykonywania repository.findOne(id)?

+1

'@OneToMany (pobranie = FetchType.EAGER)' To pomoże? – Jebil

+1

Wiem, że mogę wymusić tryb "chętny" w ten sposób. Ale chcę trzymać się domyślnego "leniwego" i po prostu wymuszać na wszystkich listach na jednym wybranym. – membersound

+0

Cóż, jeśli używasz kryteriów w DAO, możesz wymusić typ pobierania przez 'criteria.setFetchMode (" bars ", FetchMode.EAGER)' – Jebil

Odpowiedz

2

Też potrzebowałem tego i jak nazywam dao wewnątrz obiektu usługi, który jest insise, transakcja, którą nazywam, wywołanie metody get, więc nie ma wyjątku i byłem w stanie pobrać zapisy. Coś w Java 8:

public ProductEntity findProduct(int id) { 
    ProductEntity p = productRepository.findOne(id); 
    p.getPresentations().stream().count(); 
    return p; 
} 

p.getPresentations().stream().count(); zmusi sprowadzić, wiem, nie jest czysty sposób to zrobić, ale dostaje zadanie w tym czasie

3

Można wymusić chętny sprowadzić pisanie niestandardowych zapytań HQL z left join fetch, np:

interface MyEntityRepository extends CrudRepository<MyEntity, Long> { 
    @Query("select e from MyEntity e left join fetch e.bar b where e.id = ?1") 
    MyEntity findOne(long id) 
} 
-3

Zmiana mapowania z

@OneToMany(mappedBy = "bar") //lazy by default 

Aby

@OneToMany(mappedBy = "bar", fetch = FetchType.EAGER) //lazy by default 
+0

Zacytować: "Wiem, że mogę wymusić tryb taki jak ten, ale chcę pozostać przy leniwym domyślnym ustawieniu i po prostu narzucać [...] jeden konkretny wybór" – membersound