2009-08-03 2 views
2

У меня есть элементы, которые могут содержать дополнительные элементы, поэтому мне нужно отношение @OneToMany с тем же Entity. Я настроил мое поле, как это:Как иметь отношения @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.

EDIT: Полный стек трассировки:

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

ответ

2

Ваше картографирование наиболее определенно неверно.
Прежде всего, это должно быть @OneToMany, а не `@ManyToOne '- вы собираете коллекцию (то есть МНОГО). Возможно, это опечатка, поскольку название вопроса говорит «OneToMany».

Во-вторых, способ его сопоставления сделает ассоциацию однонаправленной. Это не рекомендуется. Вы 100% положительный это то, что вы хотите? Возможно, лучше изменить это на двунаправленное отображение, добавив свойство «parent».

Наконец, желая, чтобы выборка в такой ассоциации могла бы вытащить поддерево в целом при выборе элемента (например, самого элемента, его детей, их детей и т. Д.). Хотя есть некоторые обстоятельства, может быть желательным, они довольно необычны. Вы действительно хотите этого поведения? Возможно, было бы лучше использовать другую модель (например, вложенные наборы)?

0

Что вы намерены установив обнуляемым ложь?

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

Если у некоторых предметов нет детей, это правильно?

Смежные вопросы