Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Eclipse Link error with LockType

This seems to be a bug in the 1.1 build with the new JPA 2.0 lockMode option. 
It defaults to NONE in the annotations, but the code is check for null. 
Please log this bug.

I assume you have a Named update-all or delete-all query, this is causing
the issue.  You could remove the named query as a workaround.


Eric Gulatee wrote:
> 
> Hi All,
> 
> 1-  I'm getting the following error after upgrading to eclipselink
> 1.1.0 M 5 while using OSGI & Spring.
> 
> A lock type can only be used with a select query (which allows the
> database to be locked where necessary).
> 
> Another piece of info which may or may not be related:
> 
> 2-  I extended org.eclipse.persistence.jpa.osgi.PersistenceProvider in
> order to be able to externalize configuration for datasource, dialect,
> etc... into spring.  [I have a defect open for that]  I'm not certain
> if that may be the culprit, but I am guessing not since it's failing
> while trying to build JPA queries.  So I have attached that.
> Basically a rip off off the same PersistenceProvider code , aside from
> setting the classloader.
> 
> 3-  The M5 bundle plugin file with all dependencies should probably
> come bundled with the 2.0 persistence preview.  [I was getting OSGI
> failures due to javax.persistence.Cache]
> 
> Other than that, any thoughts on the the stack trace
> 
> org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'entityManager' defined in URL
> [bundleentry://76/META-INF/spring/applicationContext-db-eclipselink.xml]:
> Instantiation of bean failed; nested exception is
> org.springframework.beans.factory.BeanDefinitionStoreException:
> Factory method [public javax.persistence.EntityManager
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager()]
> threw exception; nested exception is
> javax.persistence.PersistenceException:
> java.lang.IllegalArgumentException: A lock type can only be used with
> a select query (which allows the database to be locked where
> necessary).
> 	at
> org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:444)
> 	at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:903)
> 	at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:817)
> 	at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
> 	at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
> 	at java.security.AccessController.doPrivileged(Native Method)
> 	at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
> 	at
> org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
> 	at
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
> 	at
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
> 	at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
> 	at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
> 	at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
> 	at
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
> 	at
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:288)
> 	at
> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:145)
> 	at
> com.springsource.server.kernel.dm.ContextPropagatingTaskExecutor$2.run(ContextPropagatingTaskExecutor.java:82)
> 	at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
> 	at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> 	at java.lang.Thread.run(Thread.java:619)
> Caused by: org.springframework.beans.factory.BeanDefinitionStoreException:
> Factory method [public javax.persistence.EntityManager
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager()]
> threw exception; nested exception is
> javax.persistence.PersistenceException:
> java.lang.IllegalArgumentException: A lock type can only be used with
> a select query (which allows the database to be locked where
> necessary).
> 	at
> org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:127)
> 	at
> org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:435)
> 	... 19 more
> Caused by: javax.persistence.PersistenceException:
> java.lang.IllegalArgumentException: A lock type can only be used with
> a select query (which allows the database to be locked where
> necessary).
> 	at
> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:266)
> 	at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:111)
> 	at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:159)
> 	at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:146)
> 	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
> org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:115)
> 	... 20 more
> Caused by: java.lang.IllegalArgumentException: A lock type can only be
> used with a select query (which allows the database to be locked where
> necessary).
> 	at
> org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:184)
> 	at
> org.eclipse.persistence.internal.jpa.JPAQuery.processJPQLQuery(JPAQuery.java:94)
> 	at
> org.eclipse.persistence.internal.jpa.JPAQuery.prepare(JPAQuery.java:85)
> 	at
> org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:447)
> 	at
> org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:413)
> 	at
> org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQueries(AbstractSession.java:1689)
> 	at
> org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:409)
> 	at
> org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:666)
> 	at
> org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:630)
> 	at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:213)
> 	at
> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:249)
> 	... 28 more
> 
> package da.osgi;
> 
> import java.net.URL;
> import java.util.Enumeration;
> import java.util.HashMap;
> import java.util.Map;
> 
> import javax.persistence.EntityManagerFactory;
> import javax.persistence.spi.ClassTransformer;
> import javax.persistence.spi.PersistenceUnitInfo;
> 
> import org.eclipse.persistence.exceptions.PersistenceUnitLoadingException;
> import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
> import org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider;
> import org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl;
> import org.eclipse.persistence.internal.jpa.deployment.JPAInitializer;
> import
> org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor;
> import
> org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitInfo;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> 
> public class DAPersistenceProvider extends
> 		org.eclipse.persistence.jpa.osgi.PersistenceProvider {
> 
> 	static Logger logger =
> LoggerFactory.getLogger(DAPersistenceProvider.class);
> 
> 	/**
> 	 * Called by Persistence class when an EntityManagerFactory is to be
> 	 * created.
> 	 * 
> 	 * @param emName
> 	 *            The name of the persistence unit
> 	 * @param map
> 	 *            A Map of properties for use by the persistence provider.
> These
> 	 *            properties may be used to override the values of the
> 	 *            corresponding elements in the persistence.xml file or
> specify
> 	 *            values for properties not specified in the persistence.xml.
> 	 * @return EntityManagerFactory for the persistence unit, or null if the
> 	 *         provider is not the right provider
> 	 */
> 	public EntityManagerFactory createEntityManagerFactory(String emName,
> 			Map properties) {
> 		ClassLoader classloader = initializationHelper.getClassLoader(emName,
> 				properties);
> 		return createEntityManagerFactory(emName, properties, classloader);
> 	}
> 
> 	/**
> 	 * Called by Persistence class when an EntityManagerFactory is to be
> 	 * created.
> 	 * 
> 	 * @param emName
> 	 *            The name of the persistence unit
> 	 * @param map
> 	 *            A Map of properties for use by the persistence provider.
> These
> 	 *            properties may be used to override the values of the
> 	 *            corresponding elements in the persistence.xml file or
> specify
> 	 *            values for properties not specified in the persistence.xml.
> 	 * @param classLoader
> 	 *            The classloader to search for persistence units on
> 	 * @return EntityManagerFactory for the persistence unit, or null if the
> 	 *         provider is not the right provider
> 	 */
> 	protected EntityManagerFactory createEntityManagerFactory(String emName,
> 			Map properties, ClassLoader classLoader) {
> 		Map nonNullProperties = (properties == null) ? new HashMap()
> 				: properties;
> 		String name = emName;
> 		if (name == null) {
> 			name = "";
> 		}
> 
> 		JPAInitializer initializer = initializationHelper.getInitializer(
> 				classLoader, nonNullProperties);
> 		EntityManagerSetupImpl emSetupImpl = null;
> 		// get a class loader to use with this specific EM
> 		ClassLoader currentLoader = initializationHelper.getClassLoader(emName,
> 				nonNullProperties);
> 
> 		try {
> 			Enumeration<URL> resources = currentLoader
> 					.getResources("META-INF/persistence.xml");
> 			boolean initialized = false;
> 			while (resources.hasMoreElements()) {
> 				String puName = PersistenceUnitProcessor
> 						.buildPersistenceUnitName(PersistenceUnitProcessor
> 								.computePURootURL(resources.nextElement()),
> 								name);
> 
> 				synchronized (EntityManagerFactoryProvider.emSetupImpls) {
> 					emSetupImpl = EntityManagerFactoryProvider
> 							.getEntityManagerSetupImpl(puName);
> 					if (emSetupImpl == null || emSetupImpl.isUndeployed()) {
> 						if (!initialized) {
> 							initializer.initialize(nonNullProperties,
> 									initializationHelper);
> 							initialized = true;
> 						}
> 						emSetupImpl = EntityManagerFactoryProvider
> 								.getEntityManagerSetupImpl(puName);
> 					}
> 				}
> 
> 				// We found a match, stop looking.
> 				if (emSetupImpl != null) {
> 					break;
> 				}
> 			}
> 		} catch (Exception e) {
> 			throw PersistenceUnitLoadingException
> 					.exceptionSearchingForPersistenceResources(currentLoader, e);
> 		}
> 
> 		// gf bug 854 Returns null if EntityManagerSetupImpl for the name
> 		// doesn't exist (e.g. a non-existant PU)
> 		if (emSetupImpl == null) {
> 			return null;
> 		}
> 
> 		if (!initializer.isPersistenceProviderSupported(emSetupImpl
> 				.getPersistenceUnitInfo().getPersistenceProviderClassName())) {
> 			return null;
> 		}
> 
> 		// synchronized to prevent overriding of the class loader
> 		// and also calls to predeploy and undeploy by other threads -
> 		// the latter may alter result of shouldRedeploy method.
> 		synchronized (emSetupImpl) {
> 			if (emSetupImpl.shouldRedeploy()) {
> 				SEPersistenceUnitInfo persistenceInfo = (SEPersistenceUnitInfo)
> emSetupImpl
> 						.getPersistenceUnitInfo();
> 				persistenceInfo.setClassLoader(initializationHelper
> 						.getClassLoader(emName, properties));
> 				if (emSetupImpl.isUndeployed()) {
> 					persistenceInfo.setNewTempClassLoader(initializationHelper
> 							.getClassLoader(emName, properties));
> 				}
> 			}
> 			// call predeploy
> 			// this will just increment the factory count since we should
> 
> 			// already be deployed
> 			emSetupImpl.predeploy(emSetupImpl.getPersistenceUnitInfo(),
> 					nonNullProperties);
> 		}
> 
> 		EntityManagerFactoryImpl factory = null;
> 		try {
> 			factory = new EntityManagerFactoryImpl(emSetupImpl,
> 					nonNullProperties);
> 
> 			// This code has been added to allow validation to occur without
> 			// actually calling createEntityManager
> 			if (emSetupImpl.shouldGetSessionOnCreateFactory(nonNullProperties)) {
> 				factory.getServerSession();
> 			}
> 			return factory;
> 		} catch (RuntimeException ex) {
> 			if (factory != null) {
> 				factory.close();
> 			} else {
> 				emSetupImpl.undeploy();
> 			}
> 			throw ex;
> 		}
> 	}
> 
> 	@Override
> 	public EntityManagerFactory createContainerEntityManagerFactory(
> 			PersistenceUnitInfo info, Map properties) {
> 		ClassLoader classloader = initializationHelper.getClassLoader(info
> 				.getPersistenceUnitName(), properties);
> 		return createContainerEntityManagerFactory(info, properties,
> 				classloader);
> 	}
> 
> 	private EntityManagerFactory createContainerEntityManagerFactory(
> 			PersistenceUnitInfo info, Map properties, ClassLoader classloader) {
> 		Map nonNullProperties = (properties == null) ? new HashMap()
> 				: properties;
> 
> 		EntityManagerSetupImpl emSetupImpl = null;
> 		boolean isNew = false;
> 		ClassTransformer transformer = null;
> 		synchronized (EntityManagerFactoryProvider.emSetupImpls) {
> 			String puName = PersistenceUnitProcessor.buildPersistenceUnitName(
> 					info.getPersistenceUnitRootUrl(), info
> 							.getPersistenceUnitName());
> 
> 			emSetupImpl = EntityManagerFactoryProvider
> 					.getEntityManagerSetupImpl(puName);
> 			if (emSetupImpl == null) {
> 				emSetupImpl = new EntityManagerSetupImpl();
> 				isNew = true;
> 				emSetupImpl.setIsInContainerMode(true);
> 				// if predeploy fails then emSetupImpl shouldn't be added to
> 				// FactoryProvider
> 				transformer = emSetupImpl.predeploy(info, nonNullProperties);
> 				EntityManagerFactoryProvider.addEntityManagerSetupImpl(puName,
> 						emSetupImpl);
> 			}
> 		}
> 
> 		if (!isNew && !emSetupImpl.isDeployed()) {
> 			transformer = emSetupImpl.predeploy(info, nonNullProperties);
> 		}
> 		if (transformer != null) {
> 			info.addTransformer(transformer);
> 		}
> 		// When EntityManagerFactory is created, the session is only partially
> 		// created
> 		// When the factory is actually accessed, the emSetupImpl will be used
> 		// to complete the session construction
> 		EntityManagerFactoryImpl factory = new EntityManagerFactoryImpl(
> 				emSetupImpl, nonNullProperties);
> 
> 		// This code has been added to allow validation to occur without
> 		// actually calling createEntityManager
> 		if (emSetupImpl.shouldGetSessionOnCreateFactory(nonNullProperties)) {
> 			factory.getServerSession();
> 		}
> 		return factory;
> 
> 	}
> 
> }
> 
> 


-----
---
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.nabble.com/EclipseLink-f26430.html EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
-- 
View this message in context: http://www.nabble.com/Eclipse-Link-error-with-LockType-tp20982238p21061217.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top