2014-12-02 49 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方法之前必须初始化蛋白质数据对象。希望这有助于