У меня проблема с репозиторием 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.
Проблема:
- , если я использую
fetch = FetchType.Lazy
, я получаю ошибку could not
initialize proxy - no session
(запускается только после обновления до весны 2.x ивернуло правильное количество строк) [Кажется, что эта ошибка в порядке, так как я пытаюсь получить list.count
позже в коде, и при проверке через отладчик до строки с ошибкой нет дубликатов] - , поэтомуна основе некоторых решений здесь SO Я использовал
FetchType.Eager
(я понимаю, чтоЭто влияет на производительность, но в любом случае мне нужно было сделать это для другой работы, поэтому я сделал это, потому что этот список меньше и мне нужно сохранять некоторую бизнес-логику во время обновлений).Но теперь я получаю дубликаты записей.
Даже если то, что я делаю, неверно, счет в списке (имеется в виду дубликаты) не должен быть неправильным?
У меня есть следующие JPA
сущности / таблицы
Epic
-> [id
(pk), name
, status_id
(fk)) Story
-> [id
(pk), name
, status_id
(fk), epic_id
(fk)) 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;
}