简体   繁体   中英

Java many-to-many object does not persist in join table

The 'Batch' object persist's perfectly in the database if I don't include the many-to-many property 'Test'. I have already tried out many different things from similar questions but can't find an answer. I have tried persisting both the owner and mapped by entities and I have also tried to use a join table for both instead of mapped one. Nothing seems to work. So the following are my entities:

@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() {
}

This is the test entity

@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() {
}

and my batchfacade

@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();
}

The batch creates fine if I don't included the test collection. So I am assuming its something to do with the join table. Here is the error i get:

>

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

Would appreciate any suggestions...

My guess is you have a null value inside your collection. ManyToMany collections cannot contain null.

I checked the latest EclipseLink code, and there is a null check for this, what version are you using? You may want to try the latest as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM