Eclipselink is attempting to convert fields it's not supposed to [message #1715193] |
Fri, 20 November 2015 00:30  |
Eclipse User |
|
|
|
Hi,
We've recently upgraded from glassfish 3.1.2.2 (eclipselink 2.3.2) to glassfish 4.1.1 (eclipselink 2.6.1), and since then we've seen intermittent issues with the old converters that used to work.
In particular we see errors like this
Caused by: Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.6.1.qualifier): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [2142420849], of class [class java.lang.String], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[usn-->smartedition.newsagentsubscriberqueue.usn]] with descriptor [RelationalDescriptor(com.inomial.newsagent.entities.NewsagentSubscriberQueue --> [DatabaseTable(smartedition.newsagentsubscriberqueue)])], could not be converted to [class java.util.UUID].
The thing that is odd is that the field in question NewsagentSubscriberQueue.usn is not annotated with @Convert at all (but the @Id field is).
@Entity
@Table(name="newsagentsubscriberqueue", schema="smartedition")
public class NewsagentSubscriberQueue implements Serializable
{
<...>
@Id
@Converter(converterClass=UUIDConverter.class, name="newsagentSubscriberQueue_uuid")
@Convert("newsagentSubscriberQueue_uuid")
@Column(name="newsagentsubscriberqueue")
private UUID newsagentSubscriberQueue = UUID.randomUUID();
private String usn;
<... other fields ...>
}
Is there something we could be doing to cause this, or is this just a bug?
|
|
|
|
|
Re: Eclipselink is attempting to convert fields it's not supposed to [message #1719081 is a reply to message #1715971] |
Mon, 04 January 2016 20:08   |
Eclipse User |
|
|
|
I've attempted to make a reproduction case, but I can't reproduce it outside of our main product, so presumably there's interference from something else, or else the reproduction case is too simple. I'm happy to try any suggestions to get the reproduction case to reproduce it.
One potential oddity to point out is that we're not using the @Id field (which is a UUID) to link the two entities, we're using a different candidate key (usn), which is the one that is triggering the problem.
Any help would be appreciated
Entity code snippits:
@Entity
@Table(name="newsagentsubscriberqueue", schema="smartedition")
@NamedQueries({
@NamedQuery(name="NewsagentSubscriberQueue.getUnprocessedSubscribersByUsn", query="Select n from NewsagentSubscriberQueue n where n.processed is null and n.usn = :usn")
})
public class NewsagentSubscriberQueue implements Serializable
{
[...]
@Id
@Converter(converterClass=UUIDConverter.class, name="newsagentSubscriberQueue_uuid")
@Convert("newsagentSubscriberQueue_uuid")
@Column(name="newsagentsubscriberqueue")
private UUID newsagentSubscriberQueue = UUID.randomUUID();
private String usn;
[more basic fields ...]
@ManyToOne
@JoinColumn(name="usn", referencedColumnName="usn", insertable=false, updatable=false)
private NewsagentSubscriberState subscriberState;
[getters & setters...]
}
@Entity
@Table(name="newsagentsubscriberstate", schema="smartedition")
public class NewsagentSubscriberState implements Serializable
{
@Id
@Converter(converterClass=UUIDConverter.class, name="newsagentsubscriberstate_uuid")
@Convert("newsagentsubscriberstate_uuid")
@Column(name="newsagentsubscriberstate")
private UUID newsagentSubscriberState = UUID.randomUUID();
private String usn;
[...]
@OneToMany (mappedBy="subscriberState", orphanRemoval=true)
private Set<NewsagentSubscriberQueue> newsagentSubscriberQueue;
[getters & setters...]
}
Local Exception Stack:
Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.6.1.qualifier): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [2142420823], of class [class java.lang.String], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[usn-->smartedition.newsagentsubscriberqueue.usn]] with descriptor [RelationalDescriptor(com.inomial.newsagent.entities.NewsagentSubscriberQueue --> [DatabaseTable(smartedition.newsagentsubscriberqueue)])], could not be converted to [class java.util.UUID].
at org.eclipse.persistence.exceptions.ConversionException.couldNotBeConverted(ConversionException.java:78)
at org.eclipse.persistence.internal.helper.ConversionManager.convertObject(ConversionManager.java:176)
at org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform.convertObject(DatasourcePlatform.java:179)
at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.getFieldValue(AbstractDirectMapping.java:789)
at org.eclipse.persistence.internal.expressions.QueryKeyExpression.getFieldValue(QueryKeyExpression.java:420)
at org.eclipse.persistence.internal.expressions.ParameterExpression.getValue(ParameterExpression.java:299)
at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.translate(DatabaseCall.java:1102)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:241)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2740)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2693)
at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:559)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1175)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:904)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1134)
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:460)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1222)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804)
at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258)
at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:473)
at com.inomial.newsagent.listener.NewsagentProvisionManagerBean.deleteFromSubscriberQueue(NewsagentProvisionManagerBean.java:267)
Triggering code:
TypedQuery<NewsagentSubscriberQueue> query = entityManager.createNamedQuery("NewsagentSubscriberQueue.getUnprocessedSubscribersByUsn", NewsagentSubscriberQueue.class);
query.setParameter("usn", usn);
List<NewsagentSubscriberQueue> queue = query.getResultList(); <-- Exception thrown here
|
|
|
Re: Eclipselink is attempting to convert fields it's not supposed to [message #1719184 is a reply to message #1719081] |
Tue, 05 January 2016 19:08  |
Eclipse User |
|
|
|
Ahha, found the problem. Naturally it was our code and not EclipseLink
One of our converters was a bit over-zealous with it's setting up of UUIDs:
public class UUIDConverter implements org.eclipse.persistence.mappings.converters.Converter
{
private static final long serialVersionUID = 1L;
@Override
public UUID convertObjectValueToDataValue(Object objectValue, Session session)
{
return (UUID) objectValue;
}
@Override
public UUID convertDataValueToObjectValue(Object dataValue, Session session)
{
return (UUID) dataValue;
}
@Override
public boolean isMutable()
{
return false;
}
@Override
public void initialize(DatabaseMapping mapping, Session session)
{
DatabaseField field = mapping.getField();
field.setSqlType(Types.OTHER);
field.setTypeName("java.util.UUID");
field.setColumnDefinition("UUID");
for (DatabaseMapping m : mapping.getDescriptor().getMappings())
{
if (m instanceof OneToOneMapping)
{
for (DatabaseField relationshipField : ((OneToOneMapping) m).getForeignKeyFields())
{
relationshipField.setSqlType(Types.OTHER);
relationshipField.setColumnDefinition("UUID");
relationshipField.setTypeName("java.util.UUID");
}
}
}
}
}
As you can see, it sets ALL fields to be UUIDs, not just the one it's dealing with! I'm pretty sure we got this off the internet, so I guess that's what we get for not understanding what we're doing!
|
|
|
Powered by
FUDForum. Page generated in 0.31964 seconds