Java 为HttpSession设置属性后,它将变为Null
我正在开发一个注册操作,用户输入他的电子邮件和密码,按下submitcreateUser方法按钮,用户实体得到持久化,并在HttpSession中设置用户id,然后他移动到下一个jsf,在那里为学校对象实体输入信息。我的问题是,用户得到了持久化,但学校没有。这是我的密码: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
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");