2014-09-22 80 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