TROUBLE WITH MANY-TO-MANY MAP
** CtCase class includes this:
private Map<String,CtContact> mInstitutions = new HashMap<String,CtContact>();
@ManyToMany( cascade = { CascadeType.MERGE, CascadeType.REFRESH } )
public Map<String,CtContact> getInstitutions()
{
return mInstitutions;
}
public void setInstitutions( Map<String,CtContact> pInstitutions )
{
mInstitutions = pInstitutions;
}
public void addInstitution( String pKey, CtContact pInstitution )
{
mInstitutions.put( pKey, pInstitution );
}
public CtContact getInstitution( String pKey )
{
return ( CtContact ) mInstitutions.get( pKey );
}
** CtCaseEJB includes this:
public CtCase update( CtCase pCase )
{
pCase = em.merge( pCase );
em.flush();
return pCase;
}
** managed bean class has this:
// get or make referral institution
CtContact aInstitution = aCase.getInstitution( CtInstitution.NM_REFERRAL );
if ( aInstitution == null )
{
aInstitution = new CtContact();
aCase.addInstitution( CtInstitution.NM_REFERRAL, aInstitution );
}
...
aInstitution.setName( aInstitutionName );
...
pCaseEJB.update( aCase );
** new records save fine, but when updating an existing one, error that happens in CaseEJB.merge() call:
[#|2011-07-22T08:31:54.551-0400|WARNING|glassfish3.1|javax.enterprise.system.container.ejb.com.sun.ejb.containers|_ThreadID=101;_ThreadName=Thread-2;|A system exception occurred during an invocation on EJB CtCaseEJB method public net.ctgt.casey.cases.CtCase net.ctgt.casey.cases.CtCaseEJB.update(net.ctgt.casey.cases.CtCase)
javax.ejb.EJBException
at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5194)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5092)
...
Caused by: Exception [EclipseLink-106] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The method [setInstitutions] on the object is throwing an exception.
Argument: [{{referral=net.ctgt.casey.contacts.CtContact@115bd99}}]
Internal Exception: java.lang.reflect.InvocationTargetException
Target Invocation Exception: java.lang.NullPointerException
Mapping: org.eclipse.persistence.mappings.ManyToManyMapping[institutions]
Descriptor: RelationalDescriptor(net.ctgt.casey.cases.CtCase --> [DatabaseTable(CTCASE)])
at org.eclipse.persistence.exceptions.DescriptorException.targetInvocationWhileSettingValueThruMethodAccessor(DescriptorException.java:1754)
at org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor.setAttributeValueInObject(MethodAttributeAccessor.java:275)
at org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor.setAttributeValueInObject(MethodAttributeAccessor.java:226)
at org.eclipse.persistence.mappings.DatabaseMapping.setAttributeValueInObject(DatabaseMapping.java:1435)
at org.eclipse.persistence.internal.indirection.IndirectionPolicy.setRealAttributeValueInObject(IndirectionPolicy.java:324)
at org.eclipse.persistence.internal.indirection.TransparentIndirectionPolicy.setRealAttributeValueInObject(TransparentIndirectionPolicy.java:405)
at org.eclipse.persistence.mappings.ForeignReferenceMapping.setRealAttributeValueInObject(ForeignReferenceMapping.java:1500)
at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1489)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:3254)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:525)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:263)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3467)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeCloneWithReferences(RepeatableWriteUnitOfWork.java:363)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3427)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.mergeInternal(EntityManagerImpl.java:452)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.merge(EntityManagerImpl.java:429)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.merge(EntityManagerWrapper.java:286)
at net.ctgt.casey.cases.CtCaseEJB.update(CtCaseEJB.java:68)
at sun.reflect.GeneratedMethodAccessor240.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5367)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
at sun.reflect.GeneratedMethodAccessor176.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:862)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:371)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5339)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5327)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
... 46 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor133.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor.setAttributeValueInObject(MethodAttributeAccessor.java:247)
... 82 more
Caused by: java.lang.NullPointerException
at java.util.Hashtable.remove(Hashtable.java:436)
at org.eclipse.persistence.indirection.IndirectMap.remove(IndirectMap.java:586)
at org.eclipse.persistence.internal.queries.MapContainerPolicy.removeFrom(MapContainerPolicy.java:732)
at org.eclipse.persistence.internal.queries.ContainerPolicy.removeFrom(ContainerPolicy.java:1379)
at org.eclipse.persistence.internal.sessions.CollectionChangeRecord.recreateOriginalCollection(CollectionChangeRecord.java:526)
at org.eclipse.persistence.mappings.CollectionMapping.updateChangeRecord(CollectionMapping.java:1906)
at org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener.internalPropertyChange(AttributeChangeListener.java:149)
at org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener.propertyChange(AttributeChangeListener.java:111)
at net.ctgt.casey.cases.CtCase._persistence_propertyChange(CtCase.java)
at net.ctgt.casey.cases.CtCase.setInstitutions(CtCase.java)
... 86 more
|#]