数据在数据库中保留,但仅在重新启动服务器时才能访问它们

时间:2018-04-17 13:50:35

标签: jpa

在执行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";
}

这是显示当前用户的CV的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..

例如:

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

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

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

1 个答案:

答案 0 :(得分:1)

你如何保存简历?他们是由两个不同的实体经理保存和审核的吗?

如果有,请查看thread关于第一级缓存和刷新的信息。

如何处理交易?如果你创建一个,你还记得提交刷新吗?

  1. 请记住,如果您使用不同的EntityManagers进行保存和重新审核,他们将看不到更改。
  2. 在您尝试查找之前,请确保您的交易并确保将CV和USER保存到数据库。
  3. 编辑:

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

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

    它适用于不同的'候选人'对象,因为这一行:

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

    如果您想在Candidat对象中保留每个组件的最新数据,只需在您从会话传递的 THIS 确切对象上进行编辑。使用find函数时,您会收到新对象,并且每个组件都有过时的数据。 尝试从组件中删除此查找。

    <强> EDIT2:

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

    然后您在CreerCV中使用find并接收类Candidate的不同实例。我们称之为 B

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

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

    您在对象B中添加要列出的内容,并希望在对象C的列表中看到此更改。