Wie kann man ihre JPA-Entities so konfigurieren, dass sie verbundene Entitäten nur dann abrufen, wenn ein bestimmter Ausführungsparameter angegeben ist.Spring Data JPARepository: Wie man Kinder unter bestimmten Bedingungen abruft
Gemäß der Dokumentation von Spring, 4.3.9. Configuring Fetch- and LoadGraphs, müssen Sie die Annotation @EntityGraph
verwenden, um Abrufrichtlinien für Abfragen anzugeben. Dies lässt mich jedoch nicht zur Laufzeit entscheiden, ob diese Entitäten geladen werden sollen.
Ich bin in Ordnung mit dem Abrufen der untergeordneten Entitäten in einer separaten Abfrage, aber um dies zu tun, müsste ich mein Repository oder Entitäten konfigurieren, keine untergeordneten abzurufen. Leider kann ich keine Strategien finden, wie dies zu tun ist. FetchPolicy
wird ignoriert, und EntityGraph
ist nur hilfreich beim Festlegen der Entitäten, die ich gerne abrufen möchte.
Angenommen, Account
ist die übergeordnete und Contact
ist das Kind, und ein Konto kann viele Kontakte haben.
Ich möchte in der Lage sein, dies zu tun:
if(fetchPolicy.contains("contacts")){
account.setContacts(contactRepository.findByAccountId(account.getAccountId());
}
Das Problem ist feder Daten abruft eifrig die Kontakte sowieso.
Der Konto Entity-Klasse sieht wie folgt aus:
@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
}
Die AccountRepository Klasse sieht wie folgt aus:
public interface AccountRepository extends JpaRepository<Account, String>
{
//@EntityGraph ... <-- has type= LOAD or FETCH, but neither can help me prevent retrieval
Account findOne(String id);
}
Beitrag der Entity-Klasse. – chrylis
Sammlungen in JPA sind standardmäßig faul, Spring Data JPA ändert daran nichts. Wenn irgendwo in Ihrem Code ein Aufruf von 'getContacts' erfolgt, wird alles abgerufen, da dies der Standard ist. –