Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 313023

Summary: java.lang.ClassCastException is thrown when Double field's value is null
Product: z_Archived Reporter: Petar Bankovic <petarbankovic>
Component: EclipselinkAssignee: Nobody - feel free to take it <nobody>
Status: CLOSED DUPLICATE QA Contact:
Severity: major    
Priority: P3 CC: amine.mzid, cfarinis, ivalo, jamesssss, peter.rosell, tom.ware, vikram.jeet.bhatia
Version: unspecified   
Target Milestone: ---   
Hardware: All   
OS: All   
Whiteboard:

Description Petar Bankovic CLA 2010-05-15 15:56:08 EDT
Build Identifier: 

When selecting entity from database, I get java.lang.ClassCastException if there is a Double field whose value in the database is null. 

Message:
    java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
Level:
    SEVERE
Stack Trace:
java.lang.Integer cannot be cast to java.lang.Double
    rs.pezar.db.entity.Artikal._persistence_set(Artikal.java)
    org.eclipse.persistence.internal.descriptors.PersistenceObjectAttributeAccessor.setAttributeValueInObject(PersistenceObjectAttributeAccessor.java:46)
    org.eclipse.persistence.mappings.DatabaseMapping.setAttributeValueInObject(DatabaseMapping.java:1368)
    org.eclipse.persistence.mappings.DatabaseMapping.readFromRowIntoObject(DatabaseMapping.java:1259)
    org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildAttributesIntoObject(ObjectBuilder.java:332)
    org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:661)
    org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneNormally(ObjectBuilder.java:583)
    org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:552)
    org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:492)
    org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:444)
    org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:635)
    org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:838)
    org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:464)
    org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:997)
    org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:675)
    org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:958)
    org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:432)
    org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1021)
    org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2898)
    org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225)
    org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207)
    org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1181)
    org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:453)
    org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:681)
    rs.pezar.gui.dialogs.sifarnici.PzDialogArtikliExtended.trazi(PzDialogArtikliExtended.java:850)
    rs.pezar.gui.dialogs.sifarnici.PzDialogArtikliExtended.access$9(PzDialogArtikliExtended.java:779)
    rs.pezar.gui.dialogs.sifarnici.PzDialogArtikliExtended$6.run(PzDialogArtikliExtended.java:1058)
    java.lang.Thread.run(Unknown Source)

Reproducible: Always
Comment 1 Tom Ware CLA 2010-05-17 08:38:00 EDT
Please provide a recreation, or, at a minimum the relevant parts of your mappings.
Comment 2 Petar Bankovic CLA 2010-05-17 09:07:12 EDT
@Entity
@Table(name="Artikal")
public class Artikal implements Serializable, PzEntity {
	private static final long serialVersionUID = 1L;

        @Id
	@Column(unique=true, nullable=false, length=255)
	private String sfrProizvod;

	@Column(nullable=false, length=255)
	private String barKod;

	@Column(nullable=false, length=255)
	private String bliziOpis;
	
	private double cenaBazna;

	private double cenaPlanska;

	private double cenaPoeni;

	private double duzina;

	private double fi;

	@Column(nullable=false, length=255)
	private String jedMere;

	@Column(length=30)
	private String katBroj;

	@Column(nullable=false, length=255)
	private String naziv;

	@Column(nullable=false, length=255)
	private String opis;

	@Column(nullable=false, length=255)
	private String dobSifra;

	@Column(nullable=false)
	private double procKala;

	@Column(nullable=false, length=255)
	private String prSifra;
	

	private double sirina;

	@Column(nullable=false)
	private double standPak;

	@Column(nullable=false)
	private double stokMax;

	@Column(nullable=false)
	private double stokMin;

	@Column(nullable=false)
	private double tezina;

	@Column(nullable=false, length=255)
	private String tip;

	private double visina;

        

        setters & getters
        ...
        ...
}

JPQL query used:
SELECT a FROM Artikal a

Double fields are making problems. If there is any double field which has null value in the database table, you will get the above exception during the query execution.

I'm using MySql database with the latest jdbc driver provided on their website (if it means anything)

Issue was detected after switching from version 1.1.2 to version 2.0.2

I suspect that the persistence api is trying to assign integer value of 0 instead of double value of 0 to the class field when null value is detected in the database.
Comment 3 Petar Bankovic CLA 2010-05-20 06:20:30 EDT
can someone confirm this is a bug ?
Comment 4 Tom Ware CLA 2010-05-28 15:07:29 EDT
The appears to be a bug in our weaving code.

You many be able to workaround by using the persistence unit property: eclipselink.weaving.internal=false
Comment 5 Christos Farinis CLA 2010-07-07 06:00:36 EDT
I have similar ClassCast exceptions on Double and Float fields when using eclipselink weaving and lazy loading.It seems that eclipselink thinks they are Integer.

I am using the latest eclipselink 2.1.x library

----------------------------------------------------------------------------


Here is typical stack trace:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
	at gr.auth.itc.euro.rdbms.EuClassStudent._persistence_set(EuClassStudent.java)
	at org.eclipse.persistence.internal.descriptors.PersistenceObjectAttributeAccessor.setAttributeValueInObject(PersistenceObjectAttributeAccessor.java:46)
	at org.eclipse.persistence.mappings.DatabaseMapping.setAttributeValueInObject(DatabaseMapping.java:1393)
	at org.eclipse.persistence.mappings.DatabaseMapping.readFromRowIntoObject(DatabaseMapping.java:1284)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildAttributesIntoObject(ObjectBuilder.java:341)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:710)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:503)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectsInto(ObjectBuilder.java:903)
	at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:423)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1074)
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:736)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1034)
	at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:380)
	at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:2392)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1291)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1273)
	at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:85)
	at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.instantiate(QueryBasedValueHolder.java:75)
	at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:83)
	at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:160)
	at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:220)
	at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:83)
	at org.eclipse.persistence.indirection.IndirectSet.buildDelegate(IndirectSet.java:192)
	at org.eclipse.persistence.indirection.IndirectSet.getDelegate(IndirectSet.java:343)
	at org.eclipse.persistence.indirection.IndirectSet.size(IndirectSet.java:500)
	at gr.auth.itc.euro.cw.server.HandleGetStudentListForClass.execute(HandleGetStudentListForClass.java:39)
	at gr.auth.itc.euro.cw.server.ClassWebServiceImpl.execute(ClassWebServiceImpl.java:85)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:562)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:224)
	at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
	at gr.auth.itc.euro.server.EntityManagerFilter.doFilter(EntityManagerFilter.java:42)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
	at gr.auth.itc.euro.server.SecurityFilter.doFilter(SecurityFilter.java:82)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:324)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Comment 6 Peter Rosell CLA 2011-01-21 07:57:51 EST
I can confirm that this bug also exists in version 2.1.2. 
The suggested workaround with disabling weaving works, so the bug seems to be in the weaving method, _persistence_set.
In my case I had a property of type long (column in Postgresql is bigint) and got this exception:
java.lang.ClassCastException: java.lang.Integer cannot be cast to
java.lang.Long

When I set dummy values in the column I could enable weaving.
Comment 7 Markku Saarela CLA 2011-10-26 11:57:34 EDT
This happens with null Short type also
Comment 8 James Sutherland CLA 2011-12-06 08:20:05 EST
setting a null-value in the mapping (DescriptorCustomizer) would most likely also resolve the issue.  My guess is it is related to setting null into a primitive that cannot take null, using Double instead of double may also work.  Primitive should generally only be used on not-null columns as they cannot store null.
Comment 9 James Sutherland CLA 2011-12-07 08:38:10 EST
Setting "eclipselink.weaving.internal"="false" should also resolve the issue.
Comment 10 Vikram Bhatia CLA 2011-12-19 03:38:58 EST
It may be duplicate of Bug325916
Comment 11 Vikram Bhatia CLA 2012-01-02 01:20:01 EST
Please test if the issue has already been fixed by using version 2.2.0 or beyond.
Comment 12 Vikram Bhatia CLA 2012-01-31 04:57:59 EST

*** This bug has been marked as a duplicate of bug 325916 ***
Comment 13 Eclipse Webmaster CLA 2022-06-09 10:23:31 EDT
The Eclipselink project has moved to Github: https://github.com/eclipse-ee4j/eclipselink