2013-04-30 62 views
0

如果我不包含多对多属性'测试',那么'批'对象在数据库中保持完美。我已经尝试了许多类似问题的不同之处,但无法找到答案。我试图持久化所有者和实体映射,我也尝试使用连接表而不是映射一个。似乎没有任何工作。因此,下面是我的实体:Java多对多对象不会保留在连接表中

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

这是测试实体

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

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

如果我不包括测试集的批处理创建罚款。所以我假设它与连接表有关。以下是错误我得到:

>

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 

希望任何建议...

+0

由于'NullPointerException'说,有一些'null',我认为这是集合本身,因为它从来没有被初始化。我会建议初始化集合,所以它们永远不会是'null',例如'List testCollection = new ArrayList <>();' – 2013-04-30 12:08:03

+0

谢谢,testcollection已经初始化为这样...所以它必须是别的东西,它是null。 – Navog 2013-05-01 03:28:57

回答

0

我的猜测是,你有你的收藏中一个空值。 ManyToMany集合不能包含null。

我检查了最新的EclipseLink代码,并且对此进行了空检查,您使用的是哪个版本?你也可以尝试最新的。

+0

谢谢@詹姆斯的答案,我试图从集合中删除任何空值,但问题仍然存在...我使用eclipseLink 2.0版 – Navog 2013-05-01 03:27:15

+0

2.0是相当古老,尝试2.4。 – James 2013-05-01 13:11:17