Eclipselink Shared Cache - Ленивые ассоциации - PullRequest
0 голосов
/ 28 сентября 2018

Я делаю приложение, использующее JPA eclipselink 2.6.4.

Я включаю общий кэш для нескольких сущностей JPA.

@Entity
@Cache(
      type=CacheType.SOFT,
      size=500 
    )
public class Tutor
{
  @Id
  @Column(name = "id")
  private String id;

  @Column(name = "name")
  private String name;

  ... getters and setters
}

@Entity
@Cache(
      type=CacheType.SOFT,
      size=500 
    )
public class Student
{
  @Id
  @Column(name = "id")
  private String id;

  @Column(name = "name")
  private String name;

  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="TUTOR_ID")
  private Tutor tutor;

  ... getters and setters
}

Я получил типичную ассоциацию сущностей:репетитор и ученики.Он определен как LAZY, потому что мы хотим избежать «проблемы N + 1», когда запрос студента выполнен.

Когда мы выполняем запрос студента и хотим, чтобы ассоциация была разрешена, мы используем технику JOIN FETCH:

SELECT s FROM Student s JOIN FETCH s.tutor t WHERE s.id = :id

Здесь все в порядке.

При первом выполнении запроса JPA, поскольку в общем кеше еще нет учеников, выполняется запрос к базе данных.Мы заполняем сущность студента сущностью tutor.

Тем не менее, во второй раз, когда мы выполняем тот же запрос, в общем кеше происходит попадание, поэтому запрос к базе данных НЕ выполняется.Но тогда сущность студента НЕ заполняется сущностью репетитора.

Мы хотели бы, чтобы сущность студента заполнялась сущностью репетитора.

Мы видели, что это возможно, изменяя ассоциацию наEAGER, но мы не хотим переходить на EAGER, чтобы избежать «проблемы N + 1».

Есть идеи?

Спасибо

...