Come configurare le proprie entità JPA per non recuperare le entità correlate a meno che non venga fornito un determinato parametro di esecuzione.Spring Data JPARepository: Come recuperare in modo subordinato le entrate dei bambini
In base alla documentazione di Spring, 4.3.9. Configuring Fetch- and LoadGraphs, è necessario utilizzare l'annotazione @EntityGraph
per specificare il criterio di recupero per le query, tuttavia ciò non consente di decidere in fase di esecuzione se si desidera caricare tali entità.
Io sto bene con ottenere le entità figlio in una query separata, ma per farlo avrei bisogno di configurare il mio repository o entità per non recuperare alcun figlio. Sfortunatamente, non riesco a trovare alcuna strategia su come farlo. FetchPolicy
viene ignorato e EntityGraph
è utile solo quando si specificano le entità che si desidera recuperare con impazienza.
Ad esempio, supporre che Account
sia il genitore e Contact
è il figlio e un account può avere molti contatti.
Voglio essere in grado di fare questo:
if(fetchPolicy.contains("contacts")){
account.setContacts(contactRepository.findByAccountId(account.getAccountId());
}
Il problema è la primavera-dati avidamente recupera i contatti in ogni modo.
classeIl Conto entità simile a questa:
@Entity
@Table(name = "accounts")
public class Account
{
protected String accountId;
protected Collection<Contact> contacts;
@OneToMany
//@OneToMany(fetch=FetchType.LAZY) --> doesn't work, Spring Repositories ignore this
@JoinColumn(name="account_id", referencedColumnName="account_id")
public Collection<Contact> getContacts()
{
return contacts;
}
//getters & setters
}
La classe AccountRepository si presenta così:
public interface AccountRepository extends JpaRepository<Account, String>
{
//@EntityGraph ... <-- has type= LOAD or FETCH, but neither can help me prevent retrieval
Account findOne(String id);
}
Messaggio di classe l'entità. – chrylis
Le raccolte in JPA sono pigre per impostazione predefinita, Spring Data JPA non cambia nulla su questo. Se c'è qualche chiamata a 'getContacts' nel tuo codice allora tutto verrà recuperato come questo è l'impostazione predefinita. –