Get the following stack trace:
Caused by: java.lang.IllegalStateException: Illegal attempt to set lock mode on a non-SELECT query at org.hibernate.jpa.spi.AbstractQueryImpl.setLockMode(AbstractQueryImpl.java:128) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.applySavedSettings(AbstractEntityManagerImpl.java:858) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.wrapAsJpaQuery(AbstractEntityManagerImpl.java:812) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createNamedJpqlQuery(AbstractEntityManagerImpl.java:806) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.buildQueryFromName(AbstractEntityManagerImpl.java:785) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:770) at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:522) at no.evote.service.impl.TestServiceImpl.deleteTasks(TestServiceImpl.java:140)
Source code can be found here: https://sourcecode.valg.no/websvn/listing.php?repname=Admin
(we will soon move to github..)
It is unfortunately difficult to run our code in a "new" environment - we work on it.
What basically happens is that we work on upgrading from glassfish 3.1.2 to glassfish 4, and from hibernate 3.5.1 to hibernate 4.3.0.CR1.
We do some manual cleaning after running a test called ElectionEventServiceTest (found in admin-backend). A method in TestServiceImpl which does the following is called:
@Override public void deleteTasks(final UserData userData, final Long electionEventPk) { Query query = getEm().createNamedQuery("Task.deleteElectionEventPk").setParameter("electionEventPk", electionEventPk); query.executeUpdate(); }
where
@NamedQuery(name = "Task.deleteElectionEventPk", query = "delete from Task t where t.electionEvent.pk = :electionEventPk"),
(Task in admin-common).
The problem can be fixed by checking if the non-select query actually just tries to set lock mode to NONE which to me seems reasonable:
My local version of AbstractQueryImpl works fine..
AbstractQueryImpl:
public TypedQuery<X> setLockMode(javax.persistence.LockModeType lockModeType) { checkOpen( true );
if ( isNativeSqlQuery() ) { throw new IllegalStateException( "Illegal attempt to set lock mode on a native SQL query" ); }
if ( ! LockModeType.NONE.equals(lockModeType)) { if ( ! isSelectQuery() ) { throw new IllegalStateException( "Illegal attempt to set lock mode on a non-SELECT query" ); }
} if ( ! canApplyAliasSpecificLockModeHints() ) { throw new IllegalStateException( "Not a JPAQL/Criteria query" ); }
this.jpaLockMode = lockModeType; internalApplyLockMode( lockModeType ); return this; }
|