Skip to main content

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

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;

	}

}

Back to the top