Как настроить свои объекты JPA, чтобы не получать связанные объекты, если не указан определенный параметр выполнения.
Согласно документации Spring, 4.3.9. Конфигурируя Fetch- и LoadGraphs, вам нужно использовать аннотацию @EntityGraph
, чтобы указать политику выборки для запросов, однако это не позволяет мне решить во время выполнения, хочу ли я загружать эти объекты.
Я в порядке с получением дочерних объектов в отдельном запросе, но для этого мне нужно настроить мой репозиторий или сущности, чтобы не извлекать ни одного из детей. К сожалению, я не могу найти стратегии для того, как это сделать. FetchPolicy
игнорируется, а EntityGraph
полезно только при определении того, какие объекты я хочу получить с нетерпением.
Например, предположим, что Account
является родителем, а Contact
является дочерним, а в учетной записи может быть много контактов.
Я хочу иметь возможность сделать это:
if(fetchPolicy.contains("contacts")){
account.setContacts(contactRepository.findByAccountId(account.getAccountId());
}
Проблема заключается в том, что spring -data охотно выбирает контакты.
Класс Entity Account выглядит следующим образом:
@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
}
Класс AccountRepository выглядит следующим образом:
public interface AccountRepository extends JpaRepository<Account, String>
{
//@EntityGraph ... <-- has type= LOAD or FETCH, but neither can help me prevent retrieval
Account findOne(String id);
}