JPA repo 在调用 findAllById 时未获取新数据,以前的数据仅存在于引用的变量中

JPA repo is not fetching fresh Data when calling findAllById the previous data is only present in the referenced variable

我正在尝试获取类别明智的问题并将类别列表传递给另一个名为 Location 的对象,如下所示

Location:
{
 List<Category> categoryList;
}

Category:
{
 List<Question> questions;
 Status status;
}
for (Category category : categories) {
    List<Question> questions = new ArrayList<>();
    questions = questionRepo.findAllById(category.getQuestionIds());
    category.setQuestions(questions);
    category.setStatus(updateQuestionStatus(questions));
    catList.add(category);
}

尝试从 table 循环中获取数据时。 JPA 存储库的 findAllById() 在我的数据库中的第一个 iteration.Where 中返回了正确的数据,状态将始终为 null。 我获取问题列表并根据一些逻辑将状态更新为 INPROGRESSTODO

在下一次迭代中,不是获取一组新数据,而是返回先前创建的 questions 变量实例,其中状态已从上一次迭代设置,而不是 null

所以最后说出所有五个位置对象都有相同的 CategoryList 问题。

我调试了我的代码并在这一行中归零了 repo 查询调用,这是 Spring JPA 而不是我的实现。

questions = questionRepo.findAllById(category.getQuestionIds());

在此之前的调试行中,问题如预期的那样 []。 但是当这一行被执行时,我得到了一份之前修改过的问题的副本。状态为我设置的 INPROGRESSTODO

我尝试了很多方法,比如将 addAll 加入新列表等,但仍然没有成功。请帮忙。提前致谢。

更新:

分享问题实体以获得更好的帮助。

@Entity
@Table(name = "m_question")
@Data
@EqualsAndHashCode(callSuper = false)
@JsonInclude(value = Include.NON_NULL)
@JsonIgnoreProperties(value = { "addedBy", "addedOn", "updatedBy", "updatedOn","deleted" })
public class Question extends Auditable<String> {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "m_question_id")
    private int mQuestionId;
    
    @Column(name = "m_q_category_id")
    private int mQCategoryId;
    
    @Column(name = "category_code")
    private String categoryCode;
    
    @Column(name = "m_q_section_id")
    private int mQSectionId;
    
    @Column(name = "section_code")
    private String sectionCode;
    
    @Column(name = "question_display")
    private String questionDisplay;
    
    @Column(name = "max_mark")
    private int maxMark;
    
    @Column(name = "more_info")
    private String moreInfo;
    
    @Column(name = "special_info")
    private String specialInfo;
    
    @Column(name = "option_type")
    private String optionType;
    
    @Column(name = "display_order")
    private Integer displayOrder;
    
    @Column(name = "is_deleted")
    private boolean isDeleted;
    
    @Column(name = "question_condition")
    private String questionCondition;
    
    @Transient
    private QuestionStatus status;
    
    @Transient
    @JsonSerialize
    @JsonDeserialize
    private List<Option> options;
}

因此,如上所示,问题实体的 table 值变化不大。但是,当我获取这些问题时,我会检查是否存在与该问题相关的任何选项,并将状态字段更新为 TODOINPROGRESS 最初应该为 null 但不是。

我什至尝试最初获取其中的所有问题(大约 500 个)并将它们放入地图中,并在需要时从地图中获取,但仍然存在相同的问题。

我不确定我做错了什么。

我能够通过在 findAllById 调用之前清除实体管理器来解决问题。这似乎打破了对先前获取的对象的引用,允许我向循环中的每个元素添加新实例。

虽然我没有因此在代码或对象中遇到任何其他问题 retrieval/persist,但我不能 100% 确定这是正确的解决方案。

现在我的问题已经解决了。

@Autowired
EntityManager em;

for (Category category : categories) {
    List<Question> questions = new ArrayList<>();
    //Clearing the entityManager instance.
    em.clear();
    questions = questionRepo.findAllById(category.getQuestionIds());
    category.setQuestions(questions);
    category.setStatus(updateQuestionStatus(questions));
    catList.add(category);
}

欢迎任何更好的解决方案或实现。谢谢