【问题标题】:Data persist in database but can't access them only if restarted the server数据保留在数据库中,但只有在重新启动服务器后才能访问它们
【发布时间】:2018-04-17 13:50:34
【问题描述】:

在执行userFacade.create(user) 时,我可以看到用户已在数据库中创建,但在我重新启动应用程序之前我无法使用该用户登录 或者如果我取消验证该会话(它在 sessionScoped 中)

其他示例:如果我创建一个 Cv 并将其添加到用户 CV,即使它在数据库中,我也无法获取使用 user.getListCvs() 创建的最后一个 cv,但如果我重新启动服务器,我可以看到它

这是创建当前用户简历的bean

public class CreerCV implements Serializable{
  @EJB 
  private CvFacade cvFacade;
  @EJB 
  CandidatFacade candidatFacade;
  private Cv cv;
  private Candidat candidat;

  @PostConstruct
  public void init(){
    
    cv=new Cv();
 
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    candidat=(Candidat)session.getAttribute("membre");
    candidat=candidatFacade.find(candidat.getId()); //so i can not get the listCVs of the my saved attribute in my session , but the listCVs of a user in the database ! This is the problem
}
//+getters and setters

public String creerCV(){
    if(candidat!=null){
        cv.setCandidat(candidat);
        candidat.getListeCv().add(cv);
        try{
            cvFacade.create(cv);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Création du cv avec succés"));
        }catch(Exception e) {
            System.out.println(e);
        }
    }
    else
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur s'est produite",""));
return "/index.xhtml";
}

这是显示当前用户简历的bean

@Named
@RequestScoped
public class ListeCvs implements Serializable{
@EJB
private CvFacade cvFacade;

private List<Cv> listeCvs=new ArrayList<>();
private Cv selectedCv;
private Candidat candidat;


@PostConstruct
public void init(){
    
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    candidat=(Candidat)session.getAttribute("membre"); 
    System.out.println(candidat.getListeCv());
    if(candidat!=null)
    listeCvs=candidat.getListeCv();
    candidat=candidatFacade.find(candidat.getId());
}
//getters+setters ect..

示例:

我创建了一个简历,我刷新我看不到表中创建的简历! 我去数据库,我可以看到它已创建 我重新启动我的应用程序,我去我的桌子我可以在桌子上看到我的简历

我创建了第二个简历,我在表中看不到它,但我可以看到我创建的前一个,我看到它是在数据库上创建的,我重新启动我的应用程序转到我的表我可以看到我的 2 份简历!

PS:对于测试,我使用System.out.print 和一些dataTables 来查看列表

【问题讨论】:

    标签: jpa


    【解决方案1】:

    如何保存简历?它们是否由两个不同的实体管理器保存和检索?

    如果是这样,请检查此thread 关于一级缓存和刷新。


    您如何处理交易?如果你创建了一个,你记得commitflush吗?

    1. 请记住,如果您使用不同的 EntityManager 进行保存和检索,他们将看不到更改。
    2. 请注意您的交易,并确保在尝试查找之前将 CV 和 USER 保存到数据库中。

    编辑:

    因此,当您使用 find 功能时,您会收到完全不同的 Candidat 类型的对象,而当您运行此部分时:

    cv.setCandidat(candidat);
    candidat.getListeCv().add(cv);
    

    它适用于不同的“候选人”对象,因为这条线:

    candidat=candidatFacade.find(candidat.getId());
    

    如果您想在 Candidat 对象中保留每个组件的最新数据,只需在您从会话传递的 THIS 确切对象上编辑它们。当您使用 find 功能时,您会收到新对象,并且每个组件都有陈旧的数据。 尝试从组件中删除此发现。

    EDIT2:

    事情就是这样。您从会话中检索候选人,我们将其称为 A。 您可以在 CreerCV 和 ListeCV 中检索它。是的,它是同一个对象。

    THEN 你在 CreerCV 中使用 find 并接收到 Candidate 类的不同实例。我们称之为B

    THEN 你在 ListeCV 中使用 find 并接收到 Candidate 类的不同实例。让我们称之为 C

    现在对象 B 和 C 具有相同的 DATA,但它们对于 java 来说是不同的对象。

    您在对象 B 中添加一些内容到列表中,并期望在对象 C 中看到列表中的这种更改。

    【讨论】:

    • 我添加了控制器
    • 我在问题中所说的简历和用户已保存在数据库中!但是当我做 getListCv 时它不起作用
    • 当我做 candidat = session .getAttrib... 时,它没有收到相同的对象?因此,在此之后,如果我确实找到(candidat.id),它将在数据库中检索相同的对象,并且我可以看到以前的结果,但看不到我添加的结果检查我的示例,我再次编辑了我的帖子
    • 我的意思是。你得到的对象 A 与对象 B 具有相同的精确数据(当你运行两个 finds 时会发生什么)然后你在对象 A 中添加一些内容,当然你不会在对象中看到这种变化B. 它们是两个不同的对象
    • 更改帐户?我一直在帮助@Sarah
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多