Java 双向一对多关系不起作用
我制作了一个应用程序,其中显示了我数据库中的许多问题。为此,我提出了一个问题。我希望能够“报告”一个关于差/好等的问题,因此为此我建立了一个反馈实体 它们之间的关系是:一个问题可能有许多反馈,而一个反馈属于一个问题 问题是,当我保存问题反馈实例时,它在数据库中完全映射,但当我打开一个问题并在所有反馈中循环时,没有显示添加的反馈。为了显示它们,我需要重新部署web应用程序 为什么会发生这种情况 为了便于阅读,我只显示相关部分 问题反馈实体Java 双向一对多关系不起作用,java,jakarta-ee,jpa,Java,Jakarta Ee,Jpa,我制作了一个应用程序,其中显示了我数据库中的许多问题。为此,我提出了一个问题。我希望能够“报告”一个关于差/好等的问题,因此为此我建立了一个反馈实体 它们之间的关系是:一个问题可能有许多反馈,而一个反馈属于一个问题 问题是,当我保存问题反馈实例时,它在数据库中完全映射,但当我打开一个问题并在所有反馈中循环时,没有显示添加的反馈。为了显示它们,我需要重新部署web应用程序 为什么会发生这种情况 为了便于阅读,我只显示相关部分 问题反馈实体 public class QuestionFeedback
public class QuestionFeedback implements Serializable {
@ManyToOne
private Question question;
....
public void setQuestion(Question question) {
this.question = question;
if (!question.getFeedbacks().contains(this)) {
question.getFeedbacks().add(this);
}
}
....
}
@Entity
public class Question implements Serializable {
@OneToMany(mappedBy = "question", fetch = FetchType.EAGER)
private List<QuestionFeedback> feedbacks;
public Question() {
feedbacks = new ArrayList<QuestionFeedback>();
}
public void addFeedback(QuestionFeedback questionFeedback) {
if (!getFeedbacks().contains(questionFeedback)) {
getFeedbacks().add(questionFeedback);
}
if (questionFeedback.getQuestion() != this) {
questionFeedback.setQuestion(this);
}
}
}
问题实体
public class QuestionFeedback implements Serializable {
@ManyToOne
private Question question;
....
public void setQuestion(Question question) {
this.question = question;
if (!question.getFeedbacks().contains(this)) {
question.getFeedbacks().add(this);
}
}
....
}
@Entity
public class Question implements Serializable {
@OneToMany(mappedBy = "question", fetch = FetchType.EAGER)
private List<QuestionFeedback> feedbacks;
public Question() {
feedbacks = new ArrayList<QuestionFeedback>();
}
public void addFeedback(QuestionFeedback questionFeedback) {
if (!getFeedbacks().contains(questionFeedback)) {
getFeedbacks().add(questionFeedback);
}
if (questionFeedback.getQuestion() != this) {
questionFeedback.setQuestion(this);
}
}
}
DAO类
public void persist(QuestionFeedback questionFeedback) {
entityManager.persist(questionFeedback);
}
这是一个简单的脏会话实例 尽管这些问题可能是由各种各样的问题引起的,但通常有两件简单的事情需要记住,这将使跟踪此错误变得非常容易 首先,您必须始终记住,当我们在JPA/hibernate中保存数据时,不一定在数据库中有任何事务已完成的gaurantee。“persist”方法的真正含义是常见的错误和问题来源,请确保您完全理解它以及它与您的业务逻辑的关系:
其次,在您确定事务已完成且数据已保存后,您可以使用EntityManager.refresh方法更新数据库中任何对象的状态 您可以通过以下代码清除JPA缓存:
em.getEntityManagerFactory().getCache().evictAll();
作为记录,我总是在保存数据后刷新。即使你的数据库有数据,我也会试试这个
public String flag() {
questionFeedback.setQuestion(question);
questionFeedbackService.persist(questionFeedback);
questionFeedbackService.flush();
return "index";
}
如果我正确理解您的问题,这似乎是一个事务性问题,因为数据正确存储在数据库中,对吗?如果为真,则必须与实体管理器的使用(和配置)相关……这可能是真的。如果我在DAO的find方法中刷新问题实体,它就会工作。好像它把它藏起来了。我在容器管理事务中使用Glassfish。这可能是正确的,因为如果我在使用
EntityManager.find()
后刷新问题实体,它会显示所有反馈。我正在使用容器管理的事务和Glassfish,所以当我的EntityManager.persist()的方法结束时,persistencecontext不应该刷新吗?并且不EntityManager.find()
从数据库中获取实体吗?或者有一些缓存或其他东西。这是有效的:public Question find(Long id){Question q=entityManager.find(Question.class,id);entityManager.refresh(q);return q;}
,它还可以在我持久化问题反馈实例时合并问题。不过我不明白。嗯。。。我不能完全掌握所有的细节。但是-我不相信每次执行persist时,persistence上下文都会自动刷新。Persist只告诉会话,在某个时刻,事务将被提交-我认为它不会强制立即提交。因此有一个JPA缓存来保存它以及持久性上下文“缓存”?JPA基本上有两个级别的缓存。函数的作用是:清除二级缓存或二级缓存。有关JPA缓存的进一步说明,请参阅链接: