Java 双向一对多关系不起作用

Java 双向一对多关系不起作用,java,jakarta-ee,jpa,Java,Jakarta Ee,Jpa,我制作了一个应用程序,其中显示了我数据库中的许多问题。为此,我提出了一个问题。我希望能够“报告”一个关于差/好等的问题,因此为此我建立了一个反馈实体 它们之间的关系是:一个问题可能有许多反馈,而一个反馈属于一个问题 问题是,当我保存问题反馈实例时,它在数据库中完全映射,但当我打开一个问题并在所有反馈中循环时,没有显示添加的反馈。为了显示它们,我需要重新部署web应用程序 为什么会发生这种情况 为了便于阅读,我只显示相关部分 问题反馈实体 public class QuestionFeedback

我制作了一个应用程序,其中显示了我数据库中的许多问题。为此,我提出了一个问题。我希望能够“报告”一个关于差/好等的问题,因此为此我建立了一个反馈实体

它们之间的关系是:一个问题可能有许多反馈,而一个反馈属于一个问题

问题是,当我保存问题反馈实例时,它在数据库中完全映射,但当我打开一个问题并在所有反馈中循环时,没有显示添加的反馈。为了显示它们,我需要重新部署web应用程序

为什么会发生这种情况

为了便于阅读,我只显示相关部分

问题反馈实体

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缓存的进一步说明,请参阅链接: