I've been trying to get Mark Fisher's 'Getting Started with JPA in Spring 2.0' blog step by step guide to using JPA in a standalone environment working with Apache Derby. I can get the tests running using embedded HSQLDB and using a networked Derby Db, but I cannot get it working with an embedded Derby DB which is unfortunately my real need.

I also get similar issues if I try and switch to Hibernate rather than TopLink. I converted the entities to just use plain Toplink + Embedded Derby without Spring and that also works. However, the combination of Spring + Toplink + Embedded Derby gives exceptions of the form shown below

PHP Code:
Local Exception Stack
Exception [TOPLINK-4002] (Oracle TopLink Essentials 2006.8 (Build 060908)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception
SQL ExceptionCannot create an instance of generated class org.apache.derby.exe.ac6074401fx010fx34bbx3b99x000000142da011.Error Code20000
Call
:SELECT IDNAMEADDRESS_ID FROM RESTAURANT WHERE (ID = ?)
    
bind => [1]
Query:ReadObjectQuery(springjpa.Restaurant)
    
at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:303)
    
at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:551)
    
at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:437)
    
at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:675)
    
at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:213)
    
at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:199)
    
at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.selectOneRow(DatasourceCallQueryMechanism.java:620)
    
at oracle.toplink.essentials.internal.queryframework.ExpressionQueryMechanism.selectOneRowFromTable(ExpressionQueryMechanism.java:2152)
    
at oracle.toplink.essentials.internal.queryframework.ExpressionQueryMechanism.selectOneRow(ExpressionQueryMechanism.java:2127)
    
at oracle.toplink.essentials.queryframework.ReadObjectQuery.executeObjectLevelReadQuery(ReadObjectQuery.java:350)
    
at oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:709)
    
at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:609)
    
at oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:677)
    
at oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:731)
    
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2218)
    
at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:937)
    
at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:894)
    
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.findInternal(EntityManagerImpl.java:298)
    
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.findInternal(EntityManagerImpl.java:274)
    
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.find(EntityManagerImpl.java:130)
    
at org.springframework.orm.jpa.JpaTemplate$1.doInJpa(JpaTemplate.java:221)
    
at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:183)
    
at org.springframework.orm.jpa.JpaTemplate.find(JpaTemplate.java:219)
    
at springjpa.JpaRestaurantDao.findById(JpaRestaurantDao.java:9)
    
at springjpa.JpaRestaurantDaoTests.testFindByIdWhereRestaurantExists(JpaRestaurantDaoTests.java:42)
    
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:585)
    
at junit.framework.TestCase.runTest(TestCase.java:154)
    
at junit.framework.TestCase.runBare(TestCase.java:127)
    
at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:69)
    
at org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests.access$001(AbstractAnnotationAwareTransactionalTests.java:44)
    
at org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests$1.run(AbstractAnnotationAwareTransactionalTests.java:112)
    
at org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests.runTest(AbstractAnnotationAwareTransactionalTests.java:177)
    
at org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests.runTestTimed(AbstractAnnotationAwareTransactionalTests.java:150)
    
at org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests.runBare(AbstractAnnotationAwareTransactionalTests.java:108)
    
at org.springframework.test.jpa.AbstractJpaTests.runBare(AbstractJpaTests.java:160)
    
at org.springframework.test.jpa.AbstractJpaTests.runBare(AbstractJpaTests.java:239)
    
at junit.framework.TestResult$1.protect(TestResult.java:106)
    
at junit.framework.TestResult.runProtected(TestResult.java:124)
    
at junit.framework.TestResult.run(TestResult.java:109)
    
at junit.framework.TestCase.run(TestCase.java:118)
    
at junit.framework.TestSuite.runTest(TestSuite.java:208)
    
at junit.framework.TestSuite.run(TestSuite.java:203
I've included here my persistence.xml and my applicationContext.xml.

applicationContext.xml
PHP Code:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="restaurantDao" class="springjpa.JpaRestaurantDao">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
  </bean>

  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="SpringJpaGettingStarted"/>
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter">
        <property name="showSql" value="true"/>
        <property name="generateDdl" value="true"/>
        <property name="databasePlatform" value="oracle.toplink.essentials.platform.database.DerbyPlatform"/>
      </bean>
    </property>
           <property name="loadTimeWeaver">
           <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
       </property>
    
  </bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
    <property name="url" value="jdbc:derby:springjpa99;create=true"/>
    <property name="username" value="sa"/>
    <property name="password" value="foobar"/>
  </bean>
 
  <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <property name="dataSource" ref="dataSource"/>
  </bean>

</beans>
persistence.xml
PHP Code:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">

  <
persistence-unit name="SpringJpaGettingStarted">
        <
provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
        <class>
springjpa.Restaurant</class>
        <class>
springjpa.Address</class>
        <class>
springjpa.Entree</class>
        
  </
persistence-unit>

</
persistence
Can anyone give any clues? From trawling the net looking for similar issues I'm wondering if this is today with load time weaving issues, but I'm not really sure what the load time weaving is doing. I tried adding in the InstrumentationLoadTimeWeaver and starting the tests by specifying both the spring-agent.jar and the toplink-essentials-agent.jar but neither approach made any difference.

I was really hoping to use Spring to enable me to manage EntityManager and transactions declaratively but this looks like it could be a show-stopper if I can't figure it out - probably have to go back to hardcoding all the EntityManager transaction calls.

Thanks for any insight
Martin