Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] Turned on JPA caching, now get weird errors resolving @OneToMany

I have an application that has been running in production for months.

I finally got around to implementing caching.  I annotated certain entities with the @Cacheable(true) annotation, and put this in my persistence.xml:

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

Upon doing this, one particular call began failing as it (seemingly) tried to resolve a @OneToMany relationship.  I am merging an instance of ResponseEntity, which has always worked in the past.

The error is as follows (stand back; more commentary under the stack trace):

Exception [EclipseLink-6094] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.QueryException
Exception Description: The parameter name [id] in the query's selection criteria does not match any parameter name defined in the query.
Query: ReadAllQuery(name="responses" referenceClass=ResponseEntity sql="SELECT id, questionID, sessionID FROM LEAD.Response WHERE (sessionID = ?) ORDER BY id ASC")
    at org.eclipse.persistence.exceptions.QueryException.parameterNameMismatch(QueryException.java:1050)
    at org.eclipse.persistence.internal.expressions.ParameterExpression.getValue(ParameterExpression.java:246)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.translate(DatabaseCall.java:951)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:206)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:264)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:647)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2558)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2517)
    at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:410)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1080)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:808)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040)
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:383)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1126)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2842)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1521)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1503)
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:98)
    at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:88)
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88)
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:161)
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:222)
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88)
    at org.eclipse.persistence.indirection.IndirectList.buildDelegate(IndirectList.java:237)
    at org.eclipse.persistence.indirection.IndirectList.getDelegate(IndirectList.java:397)
    at org.eclipse.persistence.indirection.IndirectList.size(IndirectList.java:726)
    at org.eclipse.persistence.internal.queries.CollectionContainerPolicy.sizeFor(CollectionContainerPolicy.java:177)
    at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1395)
    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.mappings.ObjectReferenceMapping.mergeIntoObject(ObjectReferenceMapping.java:461)
    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)

The entities in question here do not have @Cacheable put on them, and are essentially unchanged from the previous (working) revision.

SessionEntity contains a @OneToMany relationship mapped by ResponseEntity.

RepsonseEntity's columns are declared like this:

  @Column(name = "id")
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE, generator = "ResponseEntityIDGenerator")
  private long id;

  @JoinColumn(name = "questionID", nullable = false)
  @ManyToOne(cascade = { CascadeType.MERGE }, optional = false, targetEntity = QuestionEntity.class)
  @NotNull
  private Question question;

  @JoinColumn(name = "sessionID", nullable = false)
  @ManyToOne(cascade = { CascadeType.MERGE }, optional = false, targetEntity = SessionEntity.class)
  @NotNull
  Session session;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner", targetEntity = AnswerSelectionEntity.class)
  private Set<AnswerSelection> selections;

Note in particular the extremely visible presence :-) of the "id" column, which EclipseLink seems to be claiming does not exist.

The database underlying this is MySQL which is case insensitive if that matters.

The version of EclipseLink as recorded in the logs is that which comes with Glassfish 3.1:
EclipseLink, version: Eclipse Persistence Services - 2.2.0.v20110202-r8913

What is this suddenly-appearing error trying to tell me to do?

Best,
Laird


Back to the top