Hibernate FETCH。使用Spring Data仓库时渴望获取重复项

问题描述 投票:3回答:1

我在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)解决方案,因为它必须执行多个选择查询,并且会变得非常不正常。

问题:

  1. 如果我使用fetch = FetchType.Lazy,我会得到一个错误could not initialize proxy - no session(仅在升级到spring 2.x并返回正确的行数)[此错误似乎可以,因为我稍后尝试在代码中获取list.count,并且在错误行之前通过调试器检查时没有重复项]
  2. 所以基于SO
  3. 中的某些解决方案,我使用了FetchType.Eager(我了解这对性能的影响,但无论如何我需要做另一项工作,所以我这样做是因为此列表较小,并且需要在更新过程中保留一些业务逻辑。但是现在我得到了重复的记录。

    即使我做错了,列表中的计数(表示重复项)也应该没有错?

我有以下JPA个实体/表格

  1. Epic-> [id(pk),namestatus_id(fk))
  2. Story-> [id(pk),namestatus_id(fk),epic_id(fk))
  3. Task-> [id(pk),nameresolution_type_id(fk),story_id(fk))
  4. 请原谅我有错别字(因为我使用不同的用例手动重新创建了代码)

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),我得到了正确的答案...

java hibernate spring-boot spring-data-jpa one-to-many
1个回答
0
投票

此问题之前已被多次回答。您的选择可能是:*您应迁移到EAGER的所有Set集合*使用stream.distinct.collect对集合的getter手动进行重复过滤。

© www.soinside.com 2019 - 2024. All rights reserved.