繁体   English   中英

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

[英]after setting attribute for HttpSession it becomes Null

我正在开发一个注册操作,在该操作中,用户输入电子邮件和密码,然后按Submit(createUser方法)按钮,用户实体将保持不变并在HttpSession中设置User的ID,然后他移至下一个jsf,在其中输入School的信息对象(实体)。 我的问题是用户仍然坚持,但学校却没有。 这是我的代码:

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获取User实体,但我什么也没得到,它说:

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

@Stateless
public class UserPr {

@PersistenceContext(unitName = "proj")
private EntityManager em;


public void createUser(User user) throws RuntimeException{
    try {
        em.persist(user);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

public User getUserById(BigInteger UserId) throws Exception{
    try{
        return em.createNamedQuery("User.findById", User.class).setParameter("id", UserId).getSingleResult();
    }catch(Exception e){
        e.printStackTrace();
    }
    return null;
}

}

@NamedQueries({
@NamedQuery(name="User.findById", query="SELECT u FROM User u WHERE u.id = :id")
})
public class User implements Serializable {

首先,关于该模式的一些说明:我认为School不应该与User建立OneToOne关系。 更有可能是一对多的关系。 也许您不想为Adresse拥有一个单独的实体,它可能是一个Embeddable。

您的持久性如何设置? 您如何管理交易? 您看到的问题可能是由事务边界引起的。 究竟如何调用createUser和createSchool方法?

尝试更改获取和设置userId的方式。

代替这条线

session.setAttribute("UserId", user.getId());

尝试这个

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

而不是这个

BigInteger userId = (BigInteger) session.getAttribute("UserId");

尝试这个

BigInteger userId  = (BigInteger) sessionMap.get("UserId");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM