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
。
我获取问题列表并根据一些逻辑将状态更新为 INPROGRESS
或 TODO
在下一次迭代中,不是获取一组新数据,而是返回先前创建的 questions
变量实例,其中状态已从上一次迭代设置,而不是 null
。
所以最后说出所有五个位置对象都有相同的 CategoryList 问题。
我调试了我的代码并在这一行中归零了 repo 查询调用,这是 Spring JPA 而不是我的实现。
questions = questionRepo.findAllById(category.getQuestionIds());
在此之前的调试行中,问题如预期的那样 []
。
但是当这一行被执行时,我得到了一份之前修改过的问题的副本。状态为我设置的 INPROGRESS
或 TODO
。
我尝试了很多方法,比如将 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 值变化不大。但是,当我获取这些问题时,我会检查是否存在与该问题相关的任何选项,并将状态字段更新为 TODO
或 INPROGRESS
最初应该为 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);
}
欢迎任何更好的解决方案或实现。谢谢
我正在尝试获取类别明智的问题并将类别列表传递给另一个名为 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
。
我获取问题列表并根据一些逻辑将状态更新为 INPROGRESS
或 TODO
在下一次迭代中,不是获取一组新数据,而是返回先前创建的 questions
变量实例,其中状态已从上一次迭代设置,而不是 null
。
所以最后说出所有五个位置对象都有相同的 CategoryList 问题。
我调试了我的代码并在这一行中归零了 repo 查询调用,这是 Spring JPA 而不是我的实现。
questions = questionRepo.findAllById(category.getQuestionIds());
在此之前的调试行中,问题如预期的那样 []
。
但是当这一行被执行时,我得到了一份之前修改过的问题的副本。状态为我设置的 INPROGRESS
或 TODO
。
我尝试了很多方法,比如将 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 值变化不大。但是,当我获取这些问题时,我会检查是否存在与该问题相关的任何选项,并将状态字段更新为 TODO
或 INPROGRESS
最初应该为 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);
}
欢迎任何更好的解决方案或实现。谢谢