Java 为HttpSession设置属性后,它将变为Null

Java 为HttpSession设置属性后,它将变为Null,java,session,jakarta-ee,jpa,ejb,Java,Session,Jakarta Ee,Jpa,Ejb,我正在开发一个注册操作,用户输入他的电子邮件和密码,按下submitcreateUser方法按钮,用户实体得到持久化,并在HttpSession中设置用户id,然后他移动到下一个jsf,在那里为学校对象实体输入信息。我的问题是,用户得到了持久化,但学校没有。这是我的密码: public CreateBn() { user = new User(); school = new School(); adress = new Adresse(); school.setA

我正在开发一个注册操作,用户输入他的电子邮件和密码,按下submitcreateUser方法按钮,用户实体得到持久化,并在HttpSession中设置用户id,然后他移动到下一个jsf,在那里为学校对象实体输入信息。我的问题是,用户得到了持久化,但学校没有。这是我的密码:

public CreateBn() {
    user = new User();
    school = new School();
    adress = new Adresse();
    school.setAdresse(adress);
    facesContext = FacesContext.getCurrentInstance();
    session = (HttpSession) facesContext.getExternalContext().getSession(false);
}

public String createUser() {
    initialiserDateInscription();
    session.setAttribute("UserId", user.getId());
    //System.out.println((BigInteger) session.getAttribute("UserId"));
    userPr.createUser(user);
    return SHCOOL_INSCRIPTION;
}

public String createSchool() {
    BigInteger userId = (BigInteger) session.getAttribute("UserId");
    System.out.println("MEHDI : " + userId);
    try {
        User userTemp = userPr.getUserById(userId);// Here is the problem 
        school.setUser(userTemp);
    } catch (Exception e) {
        e.printStackTrace();
    }
    session.setAttribute("SchoolId", school.getId());
    school.setAdresse(adress);
    schoolPr.createSchool(school);
    return INSCRIPTION_RETURN;
}
正如您所看到的,我根据会话中保存的UserId获取了用户实体,但什么也没有得到,它说:

javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
任何更多的信息,我在这里。那么我该如何解决这个问题呢

@Entity
@Table(schema = "school", name = "school")
public class School implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private BigInteger id;

private String name;

@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "userId")
private User user;

@OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
@JoinColumn(name = "adressId")
private Adresse adresse;
EJB

}


首先是关于模式的一些评论:我认为学校不应该与用户建立一对一的关系。更有可能是一种一夫多妻的关系。也许你不想为ADRESE创建一个单独的实体,它可能是一个可嵌入的实体


你的持久性是如何建立的?您如何管理交易?您看到的问题可能是由事务边界引起的。createUser和createSchool方法是如何准确调用的?

尝试更改获取和设置用户ID的方式

而不是这条线

session.setAttribute("UserId", user.getId());
试试这个

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
sessionMap.put("UserId", user.getId());
BigInteger userId  = (BigInteger) sessionMap.get("UserId");
试试这个

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
sessionMap.put("UserId", user.getId());
BigInteger userId  = (BigInteger) sessionMap.get("UserId");

你也可以发布userPr类的代码吗?另外,正如我在你发布的代码中看到的,当你调用createUser函数时,你没有在user对象中设置任何东西。例如,你不调用某个地方的user.id=id。也许,你在代码的某个部分实现了这一点,但我没有看到。在数据库中,用户对象保存是否正确?如果用户被持久化到数据库中,我看到表发生了变化。问题在于设置和从会话获取用户ID。enity user是在构造函数中初始化的,所以我所要做的就是持久化。您可以发布函数getUserById的代码吗?getUserById的代码似乎还可以。如果调试应用程序,在函数getUserById中传递的用户ID是否正确?我只是开始开发它,当然我会修改它。我的问题是设置和获取会话属性。方法从JSF按钮调用
BigInteger userId  = (BigInteger) sessionMap.get("UserId");