2009-08-03 169 views
2

我有可以包含更多項目的項目,因此我需要@OneToMany與同一個實體的關係。我已經配置了這樣的我的領域:如何與自己的實體建立@OneToMany關係?

@ManyToOne(targetEntity=PersistentItem.class, fetch=FetchType.EAGER) 
@JoinColumn(name="ID_CHILDREN", nullable=false) 
HashSet<PersistentItem> children=new HashSet<PersistentItem>(); 

但是,Java總是拋出以下錯誤:

SEVERE: Servlet.service() for servlet HelloWorld threw exception 
javax.persistence.RollbackException: java.lang.NullPointerException 

是不是因爲有些項目沒有孩子嗎?

我的JPA實現提供者是EclipseLink。

編輯:完整的堆棧跟蹤是:

03-Aug-2009 19:22:09 org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet HelloWorld threw exception 
javax.persistence.RollbackException: java.lang.NullPointerException 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63) 
    at info.lenni.gate.servlet.HelloWorld.doGet(HelloWorld.java:52) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Thread.java:637) 
Caused by: java.lang.NullPointerException 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject(UnitOfWorkImpl.java:678) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObjects(UnitOfWorkImpl.java:4007) 
    at org.eclipse.persistence.mappings.ObjectReferenceMapping.cascadeDiscoverAndPersistUnregisteredNewObjects(ObjectReferenceMapping.java:743) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.cascadeDiscoverAndPersistUnregisteredNewObjects(ObjectBuilder.java:1511) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObjects(UnitOfWorkImpl.java:4019) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:182) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:628) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1387) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:160) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1060) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:84) 
    ... 16 more 
+0

你能得到一個完整的堆棧跟蹤? – jsight 2009-08-03 17:19:47

回答

2

你的映射是絕對不正確的。
首先,它應該是@OneToMany,而不是`@ManyToOne' - 您正在映射集合(即MANY)。但是,也許這是一個錯字,因爲問題標題確實會說「OneToMany」。

其次,它的映射方式將使聯想單向。這不是一個推薦的方法。你是100%積極這就是你想要的?通過添加「父」屬性將其更改爲雙向映射可能會更好。最後,當你選擇一個項目(例如項目本身,它的孩子,他們的孩子等......)時,對這樣的一個關聯的提取將會拉動整個子樹。儘管在某些情況下,可能是可取的,但它們並不常見。你真的想要這樣的行爲嗎?也許最好使用不同的模型(如嵌套)?

0

你說的可空設置爲false打算?

@JoinColumn(name="ID_CHILDREN", nullable=false) 

如果有些項目不能生孩子是嗎?