我在Spring Data仓库+ Hibernate(在Spring 2.1.4
中遇到问题)
注意:在spring 1.5.x
中一切正常
问题出在@ManyToOne(fetch = FetchType.Lazy)
上,我在1.5中获得了正确的记录,但在Spring 2.0中出错,但是在@ManyToOne(fetch = FetchType.Eager)
上,我在List<Stories>
中得到了重复的记录。
我正在使用Spring数据存储库epicRepository.findById(Long id)
(以前Spring
epicRepository.find()
,但他们在Spring 2.x中将其删除了]我不想使用@Fetch (FetchMode.SELECT)
解决方案,因为它必须执行多个选择查询,并且会变得非常不正常。
问题:
fetch = FetchType.Lazy
,我会得到一个错误could not
initialize proxy - no session
(仅在升级到spring 2.x并返回正确的行数)[此错误似乎可以,因为我稍后尝试在代码中获取list.count
,并且在错误行之前通过调试器检查时没有重复项]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;
}
我在Spring Data仓库+ Hibernate(在Spring 2.1.4中)面临问题。注意:在Spring 1.5.x中一切正常,问题出在@ManyToOne(fetch = FetchType.Lazy),我得到了正确的答案...
此问题之前已被多次回答。您的选择可能是:*您应迁移到EAGER
的所有Set
集合*使用stream.distinct.collect
对集合的getter手动进行重复过滤。