Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多对多对象在联接表中不持久_Java_Jpa_Orm_Many To Many_Persistence - Fatal编程技术网

Java多对多对象在联接表中不持久

Java多对多对象在联接表中不持久,java,jpa,orm,many-to-many,persistence,Java,Jpa,Orm,Many To Many,Persistence,如果我不包括多对多属性“Test”,那么“Batch”对象在数据库中的持久性是完美的。我已经从类似的问题中尝试了许多不同的东西,但找不到答案。我尝试了持久化所有者和实体映射,并且我还尝试对两者使用联接表,而不是映射表。似乎什么都不管用。因此,以下是我的实体: @Entity @Table(name = "batch", catalog = "postgres", schema = "public") @XmlRootElement @NamedQueries({ @NamedQuery(name

如果我不包括多对多属性“Test”,那么“Batch”对象在数据库中的持久性是完美的。我已经从类似的问题中尝试了许多不同的东西,但找不到答案。我尝试了持久化所有者和实体映射,并且我还尝试对两者使用联接表,而不是映射表。似乎什么都不管用。因此,以下是我的实体:

@Entity
@Table(name = "batch", catalog = "postgres", schema = "public")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Batch.findAll", query = "SELECT b FROM Batch b"),
@NamedQuery(name = "Batch.findByBatchId", query = "SELECT b FROM Batch b WHERE b.batchId = 
            :batchId"),      
@NamedQuery(name = "Batch.findByTestComplete", query = "SELECT b FROM Batch b WHERE 
             b.testComplete = :testComplete"),
@NamedQuery(name = "Batch.findByCompleted", query = "SELECT b FROM Batch b WHERE  
            b.completed = :completed")})
public class Batch implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 12)
@Column(name = "batch_id")
private String batchId;
@Column(name = "test_complete")
private Boolean testComplete;
@Column(name = "completed")
private Boolean completed;
@JoinTable(name = "batch_tests", joinColumns = {
    @JoinColumn(name = "batch_id", referencedColumnName = "batch_id")}, inverseJoinColumns
    = {
    @JoinColumn(name = "test_id", referencedColumnName = "test_id")})
@ManyToMany
private Collection<Test> testCollection;
@JoinColumn(name = "product_id", referencedColumnName = "product_id")
@ManyToOne(optional = false)
private Product productId;
@JoinColumn(name = "client_id", referencedColumnName = "client_id")
@ManyToOne(optional = false)
private Client clientId;

public Batch() {
}

如果您有任何建议,我将不胜感激。

我猜您的集合中有一个空值。许多集合不能包含null


我检查了最新的EclipseLink代码,这个代码有一个空检查,你使用的是什么版本?您可能还想尝试最新版本。

正如
NullPointerException
所说,有一些
null
我认为是集合本身,因为它从未初始化过。我还是建议初始化集合,这样它们就永远不能为
null
,例如
List testCollection=new ArrayList()谢谢,testcollection已经初始化为。。。所以它一定是另一个空值。感谢@James的回答,我尝试从集合中删除任何空值,但问题仍然存在。。。我使用的eclipseLink版本2.02.0已经很旧了,请尝试2.4。
@Entity
@Table(name = "test", catalog = "postgres", schema = "public")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Test.findAll", query = "SELECT t FROM Test t"),
@NamedQuery(name = "Test.findByTestId", query = "SELECT t FROM Test t WHERE t.testId = 
:testId"),
@NamedQuery(name = "Test.findByTestName", query = "SELECT t FROM Test t WHERE t.testName =
:testName")})
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "test_id")
private Integer testId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "test_name")
private String testName;
@ManyToMany(mappedBy = "testCollection")
private Collection<Batch> batchCollection;

public Test() {
}
@Stateless
public class BatchFacade extends AbstractFacade<Batch> {
@PersistenceContext(unitName = "navoglwPU")
private EntityManager em;

@Override
protected EntityManager getEntityManager() {
    return em;
}

public BatchFacade() {
    super(Batch.class);
}

@Override
public void create(Batch entity) {
    super.create(entity);
    em.flush();
}
WARNING: EJB5184:A system exception occurred during an invocation on EJB BatchFacade,   
>method: public void
>com.ngayoom.navoglw.model.BatchFacade.create(com.ngayoom.navoglw.model.Batch) 
>WARNING: javax.ejb.EJBException
>at 
>com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5215)
>at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5113)
>at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901)
>at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045)
>at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994)
>at 
>com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler
>.java:222)
>at >com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocatio>nHandlerDelegate.java:89)
>at com.sun.proxy.$Proxy1288.create(Unknown Source)
>at com.ngayoom.navoglw.model.__EJB31_Generated__BatchFacade__Intf____Bean__.create(Unknown >Source)
>at com.ngayoom.navoglw.viewcontroller.BatchBean.createBatch(BatchBean.java:90)
>at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>at java.lang.reflect.Method.invoke(Method.java:601)
>at com.sun.el.parser.AstValue.invoke(AstValue.java:254)
>at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
>at >org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
>at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
>at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
>at >javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressi>onAdapter.java:88)
>at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
>at javax.faces.component.UICommand.broadcast(UICommand.java:315)
>at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
>at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
>at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
>at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
>at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
>at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
>at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
>at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
>at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
>at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
>at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
>at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
>at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
>at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
>at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
>at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
>at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
>at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
>at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
>at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
>at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
>at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
>at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
>at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
>at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
>at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
>at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
>at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
>at java.lang.Thread.run(Thread.java:722)
>Caused by: java.lang.NullPointerException
>at >org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject(U>nitOfWorkImpl.java:752)
>at >org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObj>ects(UnitOfWorkImpl.java:4135)
>at >org.eclipse.persistence.mappings.CollectionMapping.cascadeDiscoverAndPersistUnregisteredNewOb>jects(CollectionMapping.java:396)
>at >org.eclipse.persistence.internal.descriptors.ObjectBuilder.cascadeDiscoverAndPersistUnregiste>redNewObjects(ObjectBuilder.java:1917)
>at >org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObj>ects(UnitOfWorkImpl.java:4148)
>at >org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewOb>jects(RepeatableWriteUnitOfWork.java:299)
>at >org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java>:702)
>at >org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWr>iteUnitOfWork.java:433)
>at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:780)
>at >com.sun.enterprise.container.common.impl.EntityManagerWrapper.flush(EntityManagerWrapper.java>:418)
>at com.ngayoom.navoglw.model.BatchFacade.create(BatchFacade.java:28)
>at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>at java.lang.reflect.Method.invoke(Method.java:601)
>at >org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1>052)
>   at >org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124>)
>   at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
>   at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
>   at >com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:>800)
>   at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
>   at >org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:42)
>   at sun.reflect.GeneratedMethodAccessor2273.invoke(Unknown Source)
>   at >sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.lang.reflect.Method.invoke(Method.java:601)
>   at >com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java>:861)
>   at >com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:>800)
>   at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
>   at >com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.ja>va:162)
>   at >com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProx>y.java:144)
>   at sun.reflect.GeneratedMethodAccessor2272.invoke(Unknown Source)
>   at >sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.lang.reflect.Method.invoke(Method.java:601)
>   at >com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java>:861)
>   at >com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:>800)
>   at >com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
>   at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
    ... 46 more