2014-12-02 40 views
2

我想映射用戶和ProteinData實體之間的一對一關係,但在我的用戶實體中的setter中獲得空指針異常。空指針在休眠實體的setter中的異常

我的主要服務代碼Program.java

public class Program { 

    public static void main(String a[]){ 


     Session session=HibernateUtility.getSessionFactory().openSession(); 

     session.beginTransaction(); 
     User user=new User(); 
     user.addHistory(new UserHistory(new Date(),"set name to akku")); 
     user.setName("akku"); 
     user.getProteinData().setTotal(234); 



     user.addHistory(new UserHistory(new Date(),"set goal to 234")); 
     session.save(user); 
     session.getTransaction().commit(); 

     session.beginTransaction(); 




     User loadedeUser=(User)session.get(User.class,1); 

     System.out.println(loadedeUser.getName()); 

     System.out.println(loadedeUser.getProteinData().getGoal()); 

     for(UserHistory history:loadedeUser.getHistory()){ 
      //System.out.println("key is: "+ history.getKey()); 
      System.out.println(history.getEntryTime().toString()+" "+history.getEntry()); 
     } 

     loadedeUser.getProteinData().setTotal(loadedeUser.getProteinData().getTotal()+50); 
     loadedeUser.addHistory(new UserHistory(new Date(),"added 32 proteins")); 

     session.getTransaction().commit(); 

     session.close(); 
     HibernateUtility.getSessionFactory().close(); 
    } 

} 

用戶實體

public class User { 

    private int id; 
    private String name; 


    private ProteinData proteinData; 

    private List<UserHistory> history=new ArrayList<UserHistory>(); 

    public User(){ 

     setProteinData(new ProteinData()); 
    } 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public ProteinData getProteinData() { 
     return proteinData; 
    } 


    public void setProteinData(ProteinData proteinData) { 
     this.proteinData = proteinData; 
     try{ 

     proteinData.setUser(this); //Null Pointer Exception here 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    public List<UserHistory> getHistory() { 
     return history; 
    } 
    public void setHistory(List<UserHistory> history) { 
     this.history = history; 
    } 

    public void addHistory(UserHistory historyItem){ 

     historyItem.setUser(this); 

     history.add(historyItem); 
    } 

} 

ProteinData類

public class ProteinData { 

     private int id; 
     private User user; 
     private int total; 
     private int goal; 

     public int getTotal() { 
      return total; 
     } 
     public void setTotal(int total) { 
      this.total = total; 
     } 
     public int getGoal() { 
      return goal; 
     } 
     public void setGoal(int goal) { 
      this.goal = goal; 
     } 
     public int getId() { 
      return id; 
     } 
     public void setId(int id) { 
      this.id = id; 
     } 
     public User getUser() { 
      return user; 
     } 
     public void setUser(User user) { 
      this.user = user; 
     } 
    } 

我創建了一個setter,用於在用戶中設置值proteinData變量,但通過我的setter傳遞proteinData.addUser(this)我得到空指針異常

我該如何解決這個問題?

感謝

+0

可能是蛋白質數據本身爲空,並因此導致NPE每當你嘗試解析蛋白質數據對象。檢查您的proteinData是否已加載並且不爲null! – hemanth 2014-12-02 11:18:21

回答

1

getter和setter方法是由Hibernate實體生命週期中調用,所以不能保證此setter將不會null值調用。爲避免此錯誤,只需檢查參數是否爲空

public void setProteinData(ProteinData proteinData) { 
     this.proteinData = proteinData; 
     if (proteinData != null) { 
      proteinData.setUser(this); 
     } 
    } 
+0

現在在getter上得到空指針 – silentprogrammer 2014-12-02 11:40:43

+0

關於什麼getter?在'getProteinData()'中你只有'return proteinData',你不能在那裏得到一個空指針。也許你應該更新服務代碼的問題,你是如何創建你的實體。 – 2014-12-02 11:48:43

+0

更新我的問題,獲取行'System.out.println(loadedeUser.getProteinData()。getGoal());'在我的Program.java按照您的指令。 – silentprogrammer 2014-12-02 12:19:16

0

它是因爲在調用setter方法之前必須初始化蛋白質數據對象。希望這有助於