CAMEL-5932: Use JPA API instead of @deprecated spring jpa api.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f93b1fa5 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f93b1fa5 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f93b1fa5 Branch: refs/heads/master Commit: f93b1fa59e385b5377dc8f9bf5293413528a2457 Parents: a27d5e9 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Aug 21 14:30:01 2013 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Aug 21 15:06:33 2013 +0200 ---------------------------------------------------------------------- components/camel-jpa/pom.xml | 9 ++-- .../apache/camel/component/jpa/JpaEndpoint.java | 2 +- .../apache/camel/component/jpa/JpaProducer.java | 10 +++-- .../component/jpa/AbstractJpaMethodTest.java | 46 +++++++------------- .../camel/component/jpa/JpaUseMergeTest.java | 7 +-- .../camel/component/jpa/JpaUsePersistTest.java | 26 ++++++----- .../jpa/JpaWithNamedQueryAndParametersTest.java | 24 +++++----- .../camel/processor/jpa/AbstractJpaTest.java | 4 +- .../jpa/JpaProducerConcurrentTest.java | 3 +- .../src/test/resources/META-INF/persistence.xml | 4 ++ .../resources/META-INF/spring/camel-context.xml | 9 +--- 11 files changed, 68 insertions(+), 76 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-jpa/pom.xml b/components/camel-jpa/pom.xml index 632480e..23d2a80 100644 --- a/components/camel-jpa/pom.xml +++ b/components/camel-jpa/pom.xml @@ -58,10 +58,6 @@ </dependency> <dependency> <groupId>org.springframework</groupId> - <artifactId>spring-jdbc</artifactId> - </dependency> - <dependency> - <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <dependency> @@ -77,6 +73,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-jdbc</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.apache.openjpa</groupId> <artifactId>openjpa-persistence-jdbc</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java index e99c405..dc17d3f 100644 --- a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java +++ b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java @@ -305,6 +305,6 @@ public class JpaEndpoint extends ScheduledPollEndpoint { @Override protected void doStop() throws Exception { super.doStop(); - entityManager.close(); +// entityManager.close(); } } http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaProducer.java b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaProducer.java index c83f0a6..0f9576a 100644 --- a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaProducer.java +++ b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaProducer.java @@ -53,7 +53,7 @@ public class JpaProducer extends DefaultProducer { transactionTemplate.execute(new TransactionCallback<Object>() { public Object doInTransaction(TransactionStatus status) { entityManager.joinTransaction(); - + if (values.getClass().isArray()) { Object[] array = (Object[]) values; for (int index = 0; index < array.length; index++) { @@ -82,6 +82,8 @@ public class JpaProducer extends DefaultProducer { } if (endpoint.isFlushOnSend()) { + // there may be concurrency so need to join tx before flush + entityManager.joinTransaction(); entityManager.flush(); } @@ -90,16 +92,16 @@ public class JpaProducer extends DefaultProducer { /** * save the given entity end return the managed entity - * - * @param entity - * @param entityManager * @return the managed entity */ private Object save(final Object entity, EntityManager entityManager) { + // there may be concurrency so need to join tx before persist/merge if (endpoint.isUsePersist()) { + entityManager.joinTransaction(); entityManager.persist(entity); return entity; } else { + entityManager.joinTransaction(); return entityManager.merge(entity); } } http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/AbstractJpaMethodTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/AbstractJpaMethodTest.java b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/AbstractJpaMethodTest.java index eaa7659..cbf7e0b 100644 --- a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/AbstractJpaMethodTest.java +++ b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/AbstractJpaMethodTest.java @@ -16,27 +16,19 @@ */ package org.apache.camel.component.jpa; -import static org.apache.camel.util.ServiceHelper.startServices; -import static org.apache.camel.util.ServiceHelper.stopServices; - import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; - import javax.persistence.EntityManager; -import org.apache.camel.CamelContext; import org.apache.camel.Consumer; import org.apache.camel.Exchange; import org.apache.camel.Processor; -import org.apache.camel.ProducerTemplate; import org.apache.camel.examples.Address; import org.apache.camel.examples.Customer; -import org.apache.camel.impl.DefaultCamelContext; -import org.apache.camel.impl.DefaultExchange; +import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.After; -import org.junit.Assert; import org.junit.Test; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; @@ -45,10 +37,8 @@ import org.springframework.transaction.support.TransactionTemplate; /** * @version */ -public abstract class AbstractJpaMethodTest extends Assert { +public abstract class AbstractJpaMethodTest extends CamelTestSupport { - protected CamelContext camelContext = new DefaultCamelContext(); - protected ProducerTemplate template; protected JpaEndpoint endpoint; protected EntityManager entityManager; protected TransactionTemplate transactionTemplate; @@ -59,7 +49,9 @@ public abstract class AbstractJpaMethodTest extends Assert { @After public void tearDown() throws Exception { - stopServices(consumer, template, camelContext); + if (entityManager != null) { + entityManager.close(); + } } @Test @@ -67,11 +59,8 @@ public abstract class AbstractJpaMethodTest extends Assert { setUp("jpa://" + Customer.class.getName() + "?usePersist=" + (usePersist() ? "true" : "false")); Customer customer = createDefaultCustomer(); - Exchange exchange = new DefaultExchange(camelContext); - exchange.getIn().setBody(customer); - Exchange returnedExchange = template.send(endpoint, exchange); + Customer receivedCustomer = template.requestBody(endpoint, customer, Customer.class); - Customer receivedCustomer = returnedExchange.getIn().getBody(Customer.class); assertEquals(customer.getName(), receivedCustomer.getName()); assertNotNull(receivedCustomer.getId()); assertEquals(customer.getAddress().getAddressLine1(), receivedCustomer.getAddress().getAddressLine1()); @@ -95,11 +84,8 @@ public abstract class AbstractJpaMethodTest extends Assert { List<Customer> customers = new ArrayList<Customer>(); customers.add(createDefaultCustomer()); customers.add(createDefaultCustomer()); - Exchange exchange = new DefaultExchange(camelContext); - exchange.getIn().setBody(customers); - Exchange returnedExchange = template.send(endpoint, exchange); + List returnedCustomers = template.requestBody(endpoint, customers, List.class); - List<?> returnedCustomers = returnedExchange.getIn().getBody(List.class); assertEquals(2, returnedCustomers.size()); assertEntitiesInDatabase(2, Customer.class.getName()); @@ -111,11 +97,9 @@ public abstract class AbstractJpaMethodTest extends Assert { setUp("jpa://" + Customer[].class.getName() + "?usePersist=" + (usePersist() ? "true" : "false")); Customer[] customers = new Customer[] {createDefaultCustomer(), createDefaultCustomer()}; - Exchange exchange = new DefaultExchange(camelContext); - exchange.getIn().setBody(customers); - Exchange returnedExchange = template.send(endpoint, exchange); + Object reply = template.requestBody(endpoint, customers); - Customer[] returnedCustomers = returnedExchange.getIn().getBody(Customer[].class); + Customer[] returnedCustomers = (Customer[]) reply; assertEquals(2, returnedCustomers.length); assertEntitiesInDatabase(2, Customer.class.getName()); @@ -141,6 +125,9 @@ public abstract class AbstractJpaMethodTest extends Assert { consumer.start(); assertTrue(latch.await(50, TimeUnit.SECONDS)); + + consumer.stop(); + Thread.sleep(1000); assertNotNull(receivedExchange); Customer receivedCustomer = receivedExchange.getIn().getBody(Customer.class); @@ -150,18 +137,15 @@ public abstract class AbstractJpaMethodTest extends Assert { assertEquals(customer.getAddress().getAddressLine2(), receivedCustomer.getAddress().getAddressLine2()); assertEquals(customer.getAddress().getId(), receivedCustomer.getAddress().getId()); - // give a bit tiem for consumer to delete after done + // give a bit time for consumer to delete after done Thread.sleep(1000); assertEntitiesInDatabase(0, Customer.class.getName()); assertEntitiesInDatabase(0, Address.class.getName()); } - - protected void setUp(String endpointUri) throws Exception { - template = camelContext.createProducerTemplate(); - startServices(template, camelContext); - endpoint = camelContext.getEndpoint(endpointUri, JpaEndpoint.class); + protected void setUp(String endpointUri) throws Exception { + endpoint = context.getEndpoint(endpointUri, JpaEndpoint.class); transactionTemplate = endpoint.createTransactionTemplate(); entityManager = endpoint.getEntityManager(); http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUseMergeTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUseMergeTest.java b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUseMergeTest.java index 5512c06..4520dce 100644 --- a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUseMergeTest.java +++ b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUseMergeTest.java @@ -18,10 +18,8 @@ package org.apache.camel.component.jpa; import java.util.List; -import org.apache.camel.Exchange; import org.apache.camel.examples.Address; import org.apache.camel.examples.Customer; -import org.apache.camel.impl.DefaultExchange; import org.junit.Test; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; @@ -56,11 +54,8 @@ public class JpaUseMergeTest extends AbstractJpaMethodTest { customer.getAddress().setAddressLine1("Musterstr. 1"); customer.getAddress().setAddressLine2("11111 Enterhausen"); - Exchange exchange = new DefaultExchange(camelContext); - exchange.getIn().setBody(customer); - Exchange returnedExchange = template.send(endpoint, exchange); + Customer receivedCustomer = template.requestBody(endpoint, customer, Customer.class); - Customer receivedCustomer = returnedExchange.getIn().getBody(Customer.class); assertEquals(customer.getName(), receivedCustomer.getName()); assertNotNull(receivedCustomer.getId()); assertEquals(customer.getAddress().getAddressLine1(), receivedCustomer.getAddress().getAddressLine1()); http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsePersistTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsePersistTest.java b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsePersistTest.java index d4f0a00..657895f 100644 --- a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsePersistTest.java +++ b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsePersistTest.java @@ -16,10 +16,8 @@ */ package org.apache.camel.component.jpa; -import org.apache.camel.Exchange; import org.apache.camel.examples.Address; import org.apache.camel.examples.Customer; -import org.apache.camel.impl.DefaultExchange; import org.junit.Test; /** @@ -32,21 +30,27 @@ public class JpaUsePersistTest extends AbstractJpaMethodTest { } @Test - public void produceExistingEntityShouldThowAnException() throws Exception { + public void produceExistingEntityShouldThrowAnException() throws Exception { setUp("jpa://" + Customer.class.getName() + "?usePersist=true"); - final Customer customer = createDefaultCustomer(); + Customer customer = createDefaultCustomer(); save(customer); - + long id = customer.getId(); + + // and adjust some values + customer = createDefaultCustomer(); + customer.setId(id); customer.setName("Max Mustermann"); customer.getAddress().setAddressLine1("Musterstr. 1"); customer.getAddress().setAddressLine2("11111 Enterhausen"); - Exchange exchange = new DefaultExchange(camelContext); - exchange.getIn().setBody(customer); - Exchange returnedExchange = template.send(endpoint, exchange); - - assertTrue(returnedExchange.isFailed()); - assertNotNull(returnedExchange.getException()); + + try { + // we cannot store the 2nd customer as its using the same id as the 1st + template.requestBody(endpoint, customer); + fail("Should throw exception"); + } catch (Exception e) { + // expected + } assertEntitiesInDatabase(1, Customer.class.getName()); assertEntitiesInDatabase(1, Address.class.getName()); http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java index 3bcb67d..1af0632 100644 --- a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java +++ b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; - import javax.persistence.EntityManager; import javax.persistence.PersistenceException; @@ -41,7 +40,11 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.orm.jpa.JpaCallback; -import org.springframework.orm.jpa.JpaTemplate; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import static org.apache.camel.util.ServiceHelper.startServices; public class JpaWithNamedQueryAndParametersTest extends Assert { @@ -50,8 +53,8 @@ public class JpaWithNamedQueryAndParametersTest extends Assert { protected DefaultCamelContext camelContext; protected ProducerTemplate template; protected JpaEndpoint endpoint; - protected TransactionStrategy transactionStrategy; - protected JpaTemplate jpaTemplate; + protected EntityManager entityManager; + protected TransactionTemplate transactionTemplate; protected Consumer consumer; protected Exchange receivedExchange; protected CountDownLatch latch = new CountDownLatch(1); @@ -60,8 +63,9 @@ public class JpaWithNamedQueryAndParametersTest extends Assert { @Test public void testProducerInsertsIntoDatabaseThenConsumerFiresMessageExchange() throws Exception { - transactionStrategy.execute(new JpaCallback<Object>() { - public Object doInJpa(EntityManager entityManager) throws PersistenceException { + transactionTemplate.execute(new TransactionCallback<Object>() { + public Object doInTransaction(TransactionStatus status) { + entityManager.joinTransaction(); // lets delete any exiting records before the test entityManager.createQuery("delete from " + entityName).executeUpdate(); // now lets create a dummy entry @@ -72,7 +76,7 @@ public class JpaWithNamedQueryAndParametersTest extends Assert { } }); - List<?> results = jpaTemplate.find(queryText); + List<?> results = entityManager.createQuery(queryText).getResultList(); assertEquals("Should have no results: " + results, 0, results.size()); // lets produce some objects @@ -85,7 +89,7 @@ public class JpaWithNamedQueryAndParametersTest extends Assert { }); // now lets assert that there is a result - results = jpaTemplate.find(queryText); + results = entityManager.createQuery(queryText).getResultList(); assertEquals("Should have results: " + results, 1, results.size()); Customer customer = (Customer)results.get(0); assertEquals("name property", "Willem", customer.getName()); @@ -137,8 +141,8 @@ public class JpaWithNamedQueryAndParametersTest extends Assert { assertTrue("Should be a JPA endpoint but was: " + value, value instanceof JpaEndpoint); endpoint = (JpaEndpoint)value; - transactionStrategy = endpoint.createTransactionStrategy(); - jpaTemplate = endpoint.getTemplate(); + transactionTemplate = endpoint.createTransactionTemplate(); + entityManager = endpoint.getEntityManager(); } protected String getEndpointUri() { http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/AbstractJpaTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/AbstractJpaTest.java b/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/AbstractJpaTest.java index 0fe866e..ecaf5fe 100644 --- a/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/AbstractJpaTest.java +++ b/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/AbstractJpaTest.java @@ -53,7 +53,9 @@ public abstract class AbstractJpaTest extends CamelTestSupport { @After public void tearDown() throws Exception { super.tearDown(); - entityManager.close(); + if (entityManager != null) { + entityManager.close(); + } } @Override http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java b/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java index 20af4a0..086b67e 100644 --- a/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java +++ b/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java @@ -22,6 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.examples.SendEmail; @@ -61,7 +62,7 @@ public class JpaProducerConcurrentTest extends AbstractJpaTest { responses.put(index, out); } - assertMockEndpointsSatisfied(); + assertMockEndpointsSatisfied(20, TimeUnit.SECONDS); assertEquals(files, responses.size()); http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/components/camel-jpa/src/test/resources/META-INF/persistence.xml ---------------------------------------------------------------------- diff --git a/components/camel-jpa/src/test/resources/META-INF/persistence.xml b/components/camel-jpa/src/test/resources/META-INF/persistence.xml index 9a21e7d..f799e37 100644 --- a/components/camel-jpa/src/test/resources/META-INF/persistence.xml +++ b/components/camel-jpa/src/test/resources/META-INF/persistence.xml @@ -43,6 +43,7 @@ <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> <!-- <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO, SQL=TRACE"/> --> <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/> + <property name="openjpa.Multithreaded" value="true"/> </properties> </persistence-unit> @@ -55,6 +56,7 @@ <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/> + <property name="openjpa.Multithreaded" value="true"/> </properties> </persistence-unit> @@ -67,6 +69,7 @@ <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/> + <property name="openjpa.Multithreaded" value="true"/> </properties> </persistence-unit> <!-- END SNIPPET: e1 --> @@ -80,6 +83,7 @@ <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/> + <property name="openjpa.Multithreaded" value="true"/> </properties> </persistence-unit> <!-- END SNIPPET: e2 --> http://git-wip-us.apache.org/repos/asf/camel/blob/f93b1fa5/examples/camel-example-tracer/src/main/resources/META-INF/spring/camel-context.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-tracer/src/main/resources/META-INF/spring/camel-context.xml b/examples/camel-example-tracer/src/main/resources/META-INF/spring/camel-context.xml index 2b06254..92d4aa9 100644 --- a/examples/camel-example-tracer/src/main/resources/META-INF/spring/camel-context.xml +++ b/examples/camel-example-tracer/src/main/resources/META-INF/spring/camel-context.xml @@ -32,8 +32,8 @@ <!-- in stream to allow you to enter some text in the console --> <from uri="stream:in?initialPromptDelay=4000&promptDelay=2000&promptMessage=Enter some words:"/> - <!-- split the text using parallel execution --> - <split parallelProcessing="true"> + <!-- split the text --> + <split> <!-- use methodCall expression to split the words, using a java bean to do it --> <method bean="quoteService" method="splitWords"/> @@ -111,11 +111,6 @@ </bean> <!-- this is ordinary JPA spring configuration --> - <bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate"> - <property name="entityManagerFactory" ref="entityManagerFactory"/> - </bean> - - <!-- this is ordinary JPA spring configuration --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <!-- we have named our presistence unit tracer in the META-INF/persistence.xml file --> <property name="persistenceUnitName" value="tracer"/>