java - 如何与自己的实体建立@OneToMany 关系?

标签 java jpa jakarta-ee eclipselink

我的项目可以包含更多项目,因此我需要与同一实体的@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

那是因为有些项目没有任何 child 吗?

我的 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

最佳答案

您的映射肯定是不正确的。
首先,它应该是 @OneToMany,而不是“@ManyToOne”——您正在映射一个集合(即 MANY)。不过,这可能是一个打字错误,因为问题标题确实写着“OneToMany”。

其次,它的映射方式将使关联单向。这不是推荐的方法。您100%肯定这就是您想要的吗?最好通过添加“父”属性将其更改为双向映射。

最后,当您选择一个项目(例如项目本身、它的子项、它们的子项等...)时,像这样对关联的急切抓取会拉取整个子树。在某些情况下,这可能是可取的,但它们并不常见。你真的想要这种行为吗?也许使用不同的模型(如嵌套集)会更好?

关于java - 如何与自己的实体建立@OneToMany 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223496/

相关文章:

java - 嵌套事务(而不是并发事务)的默认隔离级别是多少?

jakarta-ee - 在不同机器上具有层的 Netbeans Java EE 项目

java - 有没有办法只在 Tomcat/Wildfly/Glassfish 启动时运行方法/类?

java - JDO 与 hibernate 集成

java - JPA:可以使用 "long fooId"而不是 "Foo foo"作为 @JoinColumn (对于 JSON 兼容)?

java - 如何将 org.postgresql.geometric.PGpoint 映射到 Hibernate 类型

java - Glassfish 服务器和 ActiveMQ 出现问题 : peer did not send his wire format

java - 关于双向链表

java - 如何通过蓝牙通过参数发送配对码连接两个设备? JAVA-安卓

java - 从gradle文件读取变量到库