Hibernate FETCH.Eager извлекает дубликаты при использовании репозиториев Spring Data - PullRequest
0 голосов
/ 07 мая 2019

У меня проблема с репозиторием Spring Data + Hibernate (весной 2.1.4)

Примечание: Все работало нормально в spring 1.5.x

проблема с @ManyToOne(fetch = FetchType.Lazy) Я получаю правильные записи в 1.5, но ошибка весной 2.0, но с @ManyToOne(fetch = FetchType.Eager) я получаю дубликаты записей в List<Stories>.

Я использую репозитории данных Spring epicRepository.findById(Long id) (ранее Spring имел epicRepository.find(), но они удалили его весной 2.x)

Я не хочу использовать решение @Fetch (FetchMode.SELECT), так как оно должно выполнять несколько запросов выбора и станет очень неPerformanceman.

Проблема:

  1. , если я использую fetch = FetchType.Lazy, я получаю ошибку could not initialize proxy - no session (запускается только после обновления до весны 2.x ивернуло правильное количество строк) [Кажется, что эта ошибка в порядке, так как я пытаюсь получить list.count позже в коде, и при проверке через отладчик до строки с ошибкой нет дубликатов]
  2. , поэтомуна основе некоторых решений здесь SO Я использовал FetchType.Eager (я понимаю, чтоЭто влияет на производительность, но в любом случае мне нужно было сделать это для другой работы, поэтому я сделал это, потому что этот список меньше и мне нужно сохранять некоторую бизнес-логику во время обновлений).Но теперь я получаю дубликаты записей.

Даже если то, что я делаю, неверно, счет в списке (имеется в виду дубликаты) не должен быть неправильным?

У меня есть следующие JPA сущности / таблицы

  1. Epic -> [id (pk), name, status_id (fk))
  2. Story -> [id (pk), name, status_id (fk), epic_id (fk))
  3. Task -> [id (pk), name, resolution_type_id (fk), story_id (fk))

простите, если есть какие-либо опечатки (так как я воссоздал код вручную, используя другой вариант использования)

Epic.java

@Data
public class Epic {

  @Id
  private Long id;
  private String name;
  @OneToOne(fetch = FetchType.Eager, optional = false)
  @JoinColumn(name = id, referenceColumnName = 'id', nullable = false, insertable = true, updatable = true)
  private Status status;
   @OneToMany(fetch = FetchType.Eager, cascade = ALL, mappedBy = epic)
  private List<Story> stories;
}

Story.java

@Data
public class Story {

  @Id
  private Long id;
  private String name;
  @OneToOne(fetch = FetchType.Eager, optional = false)
  @JoinColumn(name = id, referenceColumnName = 'id', nullable = false, insertable = true, updatable = true)
  private Status status;
   @OneToMany(fetch = FetchType.Eager, cascade = ALL, mappedBy = epic)
  private List<Task> tasks;

  @ManyToOne(fetch = FetchType.Lazy)
  // This is the problem area
  // Error if FetchType.Eager 
  // But duplicates in FetchType.Lazy
  @JoinColumn(name = "id", nullable = false) 
  private Epic epic;
}

Task.java

@Data
public class Task {
  @Id
  private Long id;
  private String name;
  @ManyToOne(fetch = FetchType.Lazy)
  @JoinColumn(name = "id")
  private Story story;
  @OneToOne (fetch = FetchType.Eager, optional = true)
  @JoinColumn (name = "id", )
  private Resolution resolution;
}
...