2013-11-21 39 views
0

我得到這個錯誤,我明白這個錯誤,但我不明白爲什麼我得到這個錯誤。我的模型Course有許多SessionSession屬於1 Course。當我嘗試將會話添加到課程的會話列表中時,我會得到這個結果。這裏是我的代碼播放框架「NullPointerException發生:null」

我的控制器方法:

public static void session(Course course, Integer sessionCapacity){ 
    Session session = new Session(course, sessionCapacity); 
    course.save(); 
    session.save(); 
    if(session != null){ 
     course.sessions.add(session); 
     course.save(); 
    } 
    index(); 
} 

我查看的形式:

 #{form @Courses.session(), id:'session'} 
      <input type="hidden" name="course" value = ${course} /> 
      <input type="text" name="sessionCapacity" /> 

      <input type="submit" value="Add a session" /> 
    #{/form} 

我的會議模式:

@Entity 
public class Session extends Model { 
public Integer capacity; 

@ManyToOne 
Course course; 

public Session(Course course, Integer capacity) { 
    // TODO Auto-generated constructor stub 
    this.course = course; 
    this.capacity = capacity; 
} 
} 

我的課程模式有這樣的關係:

@OneToMany 
public List<Session> sessions; 

編輯1 :::: 所以我發現這個link,並根據它我應該初始化列表中,使我在我的課程模式更新爲public List<Session> sessions = new ArrayList<Session>();,但它仍然無法正常工作。 :(

EDIT 2 :::

這裏是堆棧我得到

17:05:56,680 DEBUG ~ select course0_.id as id4_1_, course0_.capacity as capacity4_1_, course0_.courseCode as courseCode4_1_, course0_.courseDescription as courseDe4_4_1_, course0_.courseName as courseName4_1_, course0_.department_id as department6_4_1_, department1_.id as id0_0_, department1_.DepartmentCode as Departme2_0_0_, department1_.DepartmentName as Departme3_0_0_ from Course course0_ left outer join Department department1_ on course0_.department_id=department1_.id where course0_.id=? 
17:06:03,456 ERROR ~ 

@6gbd9kpep 
Internal Server Error (500) for request POST /courses/session 

Execution exception (In /app/models/Course.java around line 37) 
NullPointerException occured : null 

play.exceptions.JavaExecutionException 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237) 
at Invocation.HTTP Request(Play!) 
Caused by: java.lang.NullPointerException 
at models.Course.AddSession(Course.java:37) 
at controllers.Courses.session(Courses.java:36) 
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557) 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479) 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) 
... 1 more 

和37號線是this.sessions.add(session);

編輯3 ::: 這是我的課程班

@Entity 
public class Course extends Model { 
public String courseName; 
public String courseCode; 

@Lob 
public String courseDescription; 

@ManyToOne 
public Department department; 
public Integer capacity; 

@OneToMany 
public List<Session> sessions = new ArrayList<Session>(); 

public Course(String courseName, String courseCode, String courseDescription, Department department){ 
    this.courseName = courseName; 
    this.courseCode = courseCode; 
    this.courseDescription = courseDescription; 
    this.department = department; 
} 
public void AddSession(Integer capacity){ 
    Session session = new Session(this, capacity); 
    //session.save(); 
    this.sessions.add(session); 
    this.save(); 
} 
public void specifyCapacity(Integer Capacity){ 
    this.capacity = Capacity; 
    this.save(); 
} 
} 

編輯4 ::: 012上的新錯誤在public void AddSession(Integer capacity)

17:27:46,017 DEBUG ~ insert into Course_Session (Course_id, sessions_id) values (?, ?) 
17:27:46,059 ERROR ~ 

@6gbd9kpf7 
Internal Server Error (500) for request POST /courses/session 

Execution exception (In /app/models/Course.java around line 40) 
IllegalStateException occured : org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: models.Session 

play.exceptions.JavaExecutionException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: models.Session 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237) 
at Invocation.HTTP Request(Play!) 
Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: models.Session 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1386) 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1317) 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1323) 
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:965) 
at play.db.jpa.JPABase._save(JPABase.java:41) 
at play.db.jpa.GenericModel.save(GenericModel.java:215) 
at models.Course.AddSession(Course.java:40) 
at controllers.Courses.session(Courses.java:36) 
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557) 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479) 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) 
... 1 more 
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: models.Session 
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243) 
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456) 
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:121) 
at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:815) 
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1203) 
at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58) 
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:345) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:962) 
... 10 more 
+0

感嘆。異常的堆棧跟蹤是什麼?它代碼的哪一行是它的參考? –

+0

更新了我的問題,並詢問了您要求提供的信息 – nupac

+0

因此,this.sessions爲空。確保初始化它。向我們展示課程代碼。 –

回答

0

嘗試添加無參數的構造函數,並在這一個初始化會話。如果實體是通過播放在場景後面進行檢索的,則可以先使用此構造者初始化實體,從而使您的會話爲空。

在保存課程之前,請根據評論代碼先保存會話。

+0

我在取消註釋'session.save();'行後仍然出現錯誤。 – nupac

+0

你得到空指針錯誤或瞬態?你有沒有嘗試在默認構造函數中初始化你的集合? – emt14

+0

對不起,對於遲到的回覆,我收到了一個短暫的錯誤,我嘗試在默認構造函數中初始化它,但沒有獲得正面結果 – nupac