2014-09-22 77 views
0

我正在开发注册操作,其中用户输入他的电子邮件和密码按提交(createUser方法)按钮,用户实体得到持久并设置用户在HttpSession中的ID,接下来他转到下一个jsf,在那里输入学校对象(实体)的信息。我的问题是,用户得到坚持,但学校不是。这里是我的代码:为HttpSession设置属性后,它变为空

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; 
} 

,你可以看到,我得到了用户实体基于保存在会话中的用户ID,但我什么也没有,它说:

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 { 
+0

你可以发布userPr类的代码吗? – 2014-09-22 10:01:42

+0

另外,正如我在您发布的代码中所看到的那样,当您调用createUser函数时,您不会在用户对象中设置任何内容。即你不呼叫某处user.id = id。也许,你在我看不到的部分代码中实现了这一点。在数据库中,用户对象是否正确保存? – 2014-09-22 10:06:45

+0

用户得到坚持在DB中,我看到表更改。问题在于设置UserId并从会话中获取。 enity用户在构造函数中初始化,所以我只需要持久 – user3923327 2014-09-22 10:07:38

回答

0

尝试更改您获取的方式并设置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"); 
+0

感谢man的帮助。 – user3923327 2014-09-22 12:09:34

+0

我的荣幸!!!! – 2014-09-22 13:08:02

0

首先对模式的一些言论:我不认为学校应该有用户OneToOne关系。更可能是OneToMany关系。也许你不想有一个单独的实体Adresse,它可能是一个Embeddable。

你的持久性如何设置?你如何管理交易?您看到的问题可能是由事务性边界造成的。如何正确调用createUser和createSchool方法?

+0

我刚开始开发它,当然我会修改。我的问题是设置和获取会话属性。方法从JSF按钮调用 – user3923327 2014-09-22 10:14:50