Избегайте извлечения свойства @ManyToOne в данных JPA Spring - PullRequest
0 голосов
/ 23 января 2020

У меня есть три объекта, как показано ниже. Я использую геттеры и сеттеры на основе Lombok:

@Getter
@Setter
@EqualsAndHashCode(callSuper = true, exclude = { "cClasses"})
class AClass {
   // some properties
   @OneToMany(mappedBy = "aClass", orphanRemoval = true)
   private List<CClass> cClasses;
}

class BClass {
  // some properties
}

@Getter
@Setter
@EqualsAndHashCode(callSuper = true, exclude = { "aClass", "bClass"})
class CClass {
  // other properties
  // this is bidirectional
  @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  @JoinColumn(name = "A_ID", referencedColumnName = "A_ID")
  private AClass aClass;

  // this is unidirectional
  @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  @JoinColumn(name = "B_ID", referencedColumnName = "B_ID")
  private BClass bClass;
}

И класс репозитория JPA выглядит следующим образом:

@Repository
public interface CClassRepository extends JpaRepository<CClass, Long> {
  List<CClass> findByBClassBidIn(List<Long> ids);
}

Вывод получается ожидаемым, но производительность очень низкая , Я вижу в журналах, что запросы на выборку для всех AClass также выполняются. Как можно избежать вызовов свойства @ManyToOne aClass.

Я пытался использовать @JsonManagedReference и @JsonIgnore для свойства aClass класса CClass. Но все же он извлекает эти записи, когда я вызываю метод репозитория. Подскажите пожалуйста, как решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Лучше перевернуть отношения, поэтому ClassB может знать о ClassC

class BClass {
  @OneTOMany(...)
  private CClass cClass;
}

@Repository
public interface BClassRepository extends JpaRepository<BClass, Long> {

  @Query("select ClassB.cClass where ClassB.id is in `ids`") // might be wrong syntax
  List<CClass> findCclassesByBClassIdIn(List<Long> ids);
}
0 голосов
/ 23 января 2020

Он запрашивает базу данных только один раз, т.е. со стороны владельца, которая имеет аннотацию @JoinColumn.

...