gpt4 book ai didi

java - Hibernate FETCH.Eager 在使用 Spring Data 存储库时获取重复项

转载 作者:行者123 更新时间:2023-12-01 14:33:34 25 4
gpt4 key购买 nike

我正面临 Spring Data repository + 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) (以前 SpringepicRepository.find() 但他们在 spring 2.x 中删除了它)

我不想使用 @Fetch (FetchMode.SELECT)解决方案,因为它必须执行多个选择查询并且会变得非常低效。

问题:

  1. 如果我使用 fetch = FetchType.Lazy我收到一个错误 could not
    initialize proxy - no session
    (升级到后才开始spring 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;
}

故事.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;
}

最佳答案

这个问题之前已经回答过很多次了。您的选择可能是:

  • 您应该迁移到集合的所有EAGER集合
  • 使用 stream.distinct.collect 对集合的 getter 手动进行重复过滤。

关于java - Hibernate FETCH.Eager 在使用 Spring Data 存储库时获取重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com