Friday 15 June 2012

java - EclipseLink JPA: NullPointerException at ParameterizedSQLBatchWritingMechanism.executeBatchedStatements -



java - EclipseLink JPA: NullPointerException at ParameterizedSQLBatchWritingMechanism.executeBatchedStatements -

also posted on eclipse forums: https://www.eclipse.org/forums/index.php/m/1471742/

i utilize eclipselink jpa on top of h2 database mysql compatibility mode: * eclipselink: 2.5.2-m1 * h2: 1.4.181

i have created datagathering hook attaches listeners various actions , updates database accordingly.

sometimes next nullpointerexception within eclipselink:

[el warning]: 2014-11-13 09:41:22.47--clientsession(1918579332)--java.lang.nullpointerexception [el warning]: 2014-11-13 09:41:22.47--unitofwork(836633225)--java.lang.nullpointerexception [el warning]: 2014-11-13 09:41:22.472--unitofwork(836633225)--java.lang.nullpointerexception nov 13, 2014 9:41:22 com.mycompany.myproduct.datagathering.listeners.porthandle onportconfigured severe: persistence error @ porthandle.onportconfigured port 'port_lana_2_v6_slaac' com.mycompany.myproduct.results.testdata.data.testdatapersistenceerror: failed persist identity portevent id null (with rollback failed!): @ com.mycompany.myproduct.results.testdata.data.testdatapersistencecontroller.persistidentity(testdatapersistencecontroller.java:270) @ com.mycompany.myproduct.testdata.data.baseentitymanager.persistidentity(baseentitymanager.java:42) @ com.mycompany.myproduct.datagathering.listeners.porthandle.onportconfigured(porthandle.java:830) .... @ com.mycompany.myproduct.run.actions.configureport$forwarder.onportconfigured(configureport.java:79) @ com.mycompany.myproduct.run.actions.configureport.invokeimpl(configureport.java:118) .... @ com.mycompany.myproduct.run.runtimescenariorunner.initialize(runtimescenariorunner.java:102) @ com.mycompany.myproduct.bear.controller.jobs.initializescenariojob.work(initializescenariojob.java:103) @ com.mycompany.myproduct.bear.controller.jobs.runtimebearjob.run(runtimebearjob.java:63) @ org.eclipse.core.internal.jobs.worker.run(worker.java:54) caused by: javax.persistence.rollbackexception: java.lang.nullpointerexception @ org.eclipse.persistence.internal.jpa.transaction.entitytransactionimpl.commit(entitytransactionimpl.java:157) @ com.mycompany.myproduct.results.testdata.data.testdatapersistencecontroller.persistidentity(testdatapersistencecontroller.java:261) ... 68 more caused by: java.lang.nullpointerexception @ org.eclipse.persistence.internal.databaseaccess.parameterizedsqlbatchwritingmechanism.executebatchedstatements(parameterizedsqlbatchwritingmechanism.java:131) @ org.eclipse.persistence.internal.databaseaccess.databaseaccessor.basicexecutecall(databaseaccessor.java:608) @ org.eclipse.persistence.internal.databaseaccess.databaseaccessor.executecall(databaseaccessor.java:558) @ org.eclipse.persistence.internal.sessions.abstractsession.basicexecutecall(abstractsession.java:1991) @ org.eclipse.persistence.sessions.server.clientsession.executecall(clientsession.java:298) @ org.eclipse.persistence.internal.queries.datasourcecallquerymechanism.executecall(datasourcecallquerymechanism.java:242) @ org.eclipse.persistence.internal.queries.datasourcecallquerymechanism.executecall(datasourcecallquerymechanism.java:228) @ org.eclipse.persistence.internal.queries.datasourcecallquerymechanism.executeselectcall(datasourcecallquerymechanism.java:299) @ org.eclipse.persistence.internal.queries.datasourcecallquerymechanism.executeselect(datasourcecallquerymechanism.java:281) @ org.eclipse.persistence.queries.datareadquery.executenoncursor(datareadquery.java:197) @ org.eclipse.persistence.queries.datareadquery.executedatabasequery(datareadquery.java:152) @ org.eclipse.persistence.queries.databasequery.execute(databasequery.java:899) @ org.eclipse.persistence.queries.datareadquery.execute(datareadquery.java:137) @ org.eclipse.persistence.internal.sessions.abstractsession.internalexecutequery(abstractsession.java:3203) @ org.eclipse.persistence.internal.sessions.abstractsession.executequery(abstractsession.java:1793) @ org.eclipse.persistence.internal.sessions.abstractsession.executequery(abstractsession.java:1775) @ org.eclipse.persistence.internal.sessions.abstractsession.executequery(abstractsession.java:1726) @ org.eclipse.persistence.sequencing.querysequence.select(querysequence.java:309) @ org.eclipse.persistence.sequencing.querysequence.updateandselectsequence(querysequence.java:254) @ org.eclipse.persistence.sequencing.standardsequence.getgeneratedvalue(standardsequence.java:61) @ org.eclipse.persistence.sequencing.sequence.getgeneratedvalue(sequence.java:225) @ org.eclipse.persistence.internal.sequencing.sequencingmanager$nopreallocation_state.getnextvalue(sequencingmanager.java:677) @ org.eclipse.persistence.internal.sequencing.sequencingmanager.getnextvalue(sequencingmanager.java:1067) @ org.eclipse.persistence.internal.sequencing.clientsessionsequencing.getnextvalue(clientsessionsequencing.java:70) @ org.eclipse.persistence.internal.descriptors.objectbuilder.assignsequencenumber(objectbuilder.java:361) @ org.eclipse.persistence.internal.descriptors.objectbuilder.assignsequencenumber(objectbuilder.java:334) @ org.eclipse.persistence.internal.queries.databasequerymechanism.updateobjectandrowwithsequencenumber(databasequerymechanism.java:859) @ org.eclipse.persistence.internal.queries.datasourcecallquerymechanism.insertobject(datasourcecallquerymechanism.java:372) @ org.eclipse.persistence.internal.queries.statementquerymechanism.insertobject(statementquerymechanism.java:165) @ org.eclipse.persistence.internal.queries.statementquerymechanism.insertobject(statementquerymechanism.java:180) @ org.eclipse.persistence.internal.queries.databasequerymechanism.insertobjectforwrite(databasequerymechanism.java:489) @ org.eclipse.persistence.queries.insertobjectquery.executecommit(insertobjectquery.java:80) @ org.eclipse.persistence.queries.insertobjectquery.executecommitwithchangeset(insertobjectquery.java:90) @ org.eclipse.persistence.internal.queries.databasequerymechanism.executewritewithchangeset(databasequerymechanism.java:301) @ org.eclipse.persistence.queries.writeobjectquery.executedatabasequery(writeobjectquery.java:58) @ org.eclipse.persistence.queries.databasequery.execute(databasequery.java:899) @ org.eclipse.persistence.queries.databasequery.executeinunitofwork(databasequery.java:798) @ org.eclipse.persistence.queries.objectlevelmodifyquery.executeinunitofworkobjectlevelmodifyquery(objectlevelmodifyquery.java:108) @ org.eclipse.persistence.queries.objectlevelmodifyquery.executeinunitofwork(objectlevelmodifyquery.java:85) @ org.eclipse.persistence.internal.sessions.unitofworkimpl.internalexecutequery(unitofworkimpl.java:2896) @ org.eclipse.persistence.internal.sessions.abstractsession.executequery(abstractsession.java:1793) @ org.eclipse.persistence.internal.sessions.abstractsession.executequery(abstractsession.java:1775) @ org.eclipse.persistence.internal.sessions.abstractsession.executequery(abstractsession.java:1726) @ org.eclipse.persistence.internal.sessions.commitmanager.commitnewobjectsforclasswithchangeset(commitmanager.java:226) @ org.eclipse.persistence.internal.sessions.commitmanager.commitallobjectswithchangeset(commitmanager.java:125) @ org.eclipse.persistence.internal.sessions.abstractsession.writeallobjectswithchangeset(abstractsession.java:4196) @ org.eclipse.persistence.internal.sessions.unitofworkimpl.committodatabase(unitofworkimpl.java:1441) @ org.eclipse.persistence.internal.sessions.unitofworkimpl.committodatabasewithchangeset(unitofworkimpl.java:1531) @ org.eclipse.persistence.internal.sessions.repeatablewriteunitofwork.commitrootunitofwork(repeatablewriteunitofwork.java:277) @ org.eclipse.persistence.internal.sessions.unitofworkimpl.commitandresume(unitofworkimpl.java:1169) @ org.eclipse.persistence.internal.jpa.transaction.entitytransactionimpl.commit(entitytransactionimpl.java:132) ... 69 more

this doesn't occur, rather 1 times in 5 10.

some relevant code snippets:

public class porthandle { public void onportcreated(runtimeport rtport) { string portname = rtport.getname(); seek { port port = generatepersistedport(rtport); ---> creates , persists port entity used below portcache.put(rtport, port); // set in cache, utilize in other callbacks } grab (testdatapersistenceerror e) { logger.log(level.severe, "persistence error @ porthandle.onportcreated port '" + portname + "'", e); } } public void onportconfigured(runtimeport rtport) { date time = new date(); string portname = rtport.getname(); seek { port port = getcachedportentity(rtport); // filled before callback, see above port.setstatus(portstatus.active); portmanager.persistidentity(port); // log event string message = "port '" + portname + "' configured."; eventseverity severity = eventseverity.test_log; portevent event = new portevent(time, message, severity, port); eventmanager.persistidentity(event); ---> eventmanager has link testdatapersistencecontroller below ---> throws exception! } grab (testdatapersistenceerror e) { logger.log(level.severe, "persistence error @ porthandle.onportconfigured port '" + portname + "'", e); ----> seen in log above! } } private final map<runtimeport, port> portcache; // kept in sync private port getcachedportentity(runtimeport rtport) throws testdatapersistenceerror { string portname = rtport.getname(); port port = portcache.get(rtport); if (port == null) { throw new illegalstateexception(); } portmanager.refreshidentity(port); if (port.getid() == null) { throw new illegalstateexception(); } homecoming port; } }

all events derive base of operations entity identity:

public interface identity { public long getid(); } @mappedsuperclass public abstract class baseentity implements identity, serializable { private static final long serialversionuid = 1l; @id @generatedvalue(strategy = generationtype.identity) @column(name = "id", unique = true, nullable = false) private long id; @override public long getid() { homecoming id; } ... (equals + hashcode implementation) }

these entities persisted follows:

public class testdatapersistencecontroller { void persistidentity(baseentity identity) throws testdatapersistenceerror { if (identity == null) { throw new illegalargumentexception("failed persist entity; null entity provided"); } string classname = identity.getclass().getsimplename(); entitymanager em = getentitymanager(); seek { em.gettransaction().begin(); if (identity.getid() == null) { em.persist(identity); } else { em.merge(identity); } em.gettransaction().commit(); } grab (exception ex) { boolean rollbackfailed = false; seek { em.gettransaction().rollback(); } grab (exception exx) { rollbackfailed = true; } if (rollbackfailed) { throw new testdatapersistenceerror("failed persist identity " + classname + " id " + identity.getid() + " (with rollback failed!):", ex); } else { throw new testdatapersistenceerror("failed persist identity " + classname + " id " + identity.getid() + " (with successful rollback)", ex); } } } }

finally, there event , portevent entities:

@entity @inheritance(strategy = inheritancetype.joined) @discriminatorcolumn(name = "type") @discriminatorvalue(value = "generic") @table(name = "event") public class event extends baseentity { private static final long serialversionuid = 1l; @temporal(temporaltype.timestamp) @column(name = "event_time", nullable = false) private date eventtime; @column(name = "description", length = 400, nullable = false) private string description; @enumerated(enumtype.string) @column(name = "severity", length = 40, nullable = false) private eventseverity severity; public event(date eventtime, string description, eventseverity severity) { .... (null checks + assignments) } event() { } ... (getters , setters) } @entity @discriminatorvalue("port") @table(name = "event_port") public class portevent extends event { private static final long serialversionuid = 1l; @manytoone @joincolumn(name = "port_id") private port port; public portevent(date eventtime, string description, eventseverity severity, port port) { super(eventtime, description, severity); this.port = port; } portevent() { } .... (getters , setters) }

am doing wrong here? in case, think npe should not come eclipselink library.

thanks!

[edit]: info on subsequent error

perhaps because of initial error, next exception later on:

severe: persistence error @ porthandle.onscenariostopped port 'port_lana_1_v6_slaac' com.mycompany.myproduct.results.testdata.data.testdatapersistenceerror: failed refresh identity port id 1 @ com.mycompany.myproduct.results.testdata.data.testdatapersistencecontroller.refreshidentity(testdatapersistencecontroller.java:301) @ com.mycompany.myproduct.results.testdata.data.baseentitymanager.refreshidentity(baseentitymanager.java:46) @ com.mycompany.myproduct.datagathering.listeners.porthandle.getcachedportentity(porthandle.java:904) @ com.mycompany.myproduct.datagathering.listeners.porthandle.onscenariostopped(porthandle.java:880) ... @ com.mycompany.myproduct.run.actions.stopscenario$forwarder.onscenariostopped(stopscenario.java:21) @ com.mycompany.myproduct.run.actions.stopscenario.invokeimpl(stopscenario.java:47) ... @ com.mycompany.myproduct.run.runtimescenariorunner.run(runtimescenariorunner.java:149) @ com.mycompany.myproduct.bear.controller.jobs.runscenariojob.work(runscenariojob.java:55) @ com.mycompany.myproduct.bear.controller.jobs.runtimebearjob.run(runtimebearjob.java:63) @ org.eclipse.core.internal.jobs.worker.run(worker.java:54) caused by: java.lang.illegalargumentexception: can not refresh not managed object: com.mycompany.myproduct.results.testdata.data.entities.port@7ff72a57. @ org.eclipse.persistence.internal.jpa.entitymanagerimpl.refresh(entitymanagerimpl.java:1024) @ org.eclipse.persistence.internal.jpa.entitymanagerimpl.refresh(entitymanagerimpl.java:929) @ com.mycompany.myprodyct.results.testdata.data.testdatapersistencecontroller.refreshidentity(testdatapersistencecontroller.java:299) ... 44 more

this comes next code:

public class porthandle { public void onscenariostopped(runtimescenario rtscenario) { date time = new date(); // event time (runtimeport rtport : rtscenario.getruntimeports()) { string portname = rtport.getname(); seek { port port = getcachedportentity(rtport); ----> throws exception! port.setstatus(portstatus.stopped); portmanager.persistidentity(port); // log event string message = "port '" + portname + "' destroyed."; eventseverity severity = eventseverity.test_log; portevent event = new portevent(time, message, severity, port); eventmanager.persistidentity(event); } grab (testdatapersistenceerror e) { logger.log(level.severe, "persistence error @ porthandle.onscenariostopped port '" + portname + "'", e); ----> seen in log above! } } } }

[edit2]: info on how database generated

perhaps of import note don't generate ddl statements , subsequent database jpa entities, separate tool, mysql workbench.

in tool, set id columns auto increment. example, contains table generation statements one:

create table if not exists `testdata`.`event` ( `id` bigint(20) not null auto_increment, `event_time` timestamp not null, `description` varchar(400) not null, `severity` varchar(40) not null, `type` varchar(40) not null, primary key (`id`) ) engine = innodb;

java jpa eclipselink jpa-2.0 h2

No comments:

Post a Comment