Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What to put into jta-data-source of persistence.xml?

What value should I place into <jta-data-source> of my persistence.xml?

In glassfish admin panel I created a datasource name "abcDS". In my jndi.properties (inside src/test/resources) I defined it like this:

[...] abcDS=new://Resource?type=DataSource abcDS.JdbcDriver=org.hsqldb.jdbcDriver abcDS.JdbcUrl=jdbc:hsqldb:mem:testdb abcDS.JtaManaged=true [...] 

What shall I place into persistence.xml? I've found a lot of variants in the Net, like: "jdbc/abcDS", "java:/abcDS", "abcDS". Which one is right? And is there some rule for this? I understand that it's related to JNDI, but...

I'm trying to create EMF in my unit test:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("abc"); 

This is what I'm getting in log:

[...] SEVERE: Could not find datasource: abcDS javax.naming.NameNotFoundException:      Name "abcDS" not found. at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:193) at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:150) at org.apache.openejb.core.ivm.naming.ContextWrapper.lookup(ContextWrapper.java:115) at javax.naming.InitialContext.lookup(InitialContext.java:392) [...] 
like image 243
yegor256 Avatar asked Oct 29 '10 11:10

yegor256


People also ask

What is JTA data-source in persistence xml?

The jta-data-source (for JTA-aware data sources) and non-jta-data-source (for non-JTA-aware data sources) elements specify the global JNDI name of the data source to be used by the container. The JAR file or directory whose META-INF directory contains persistence. xml is called the root of the persistence unit.

Where should I put persistence xml?

xml should be put in the EJB JAR's META-INF directory. If you package the persistence unit as a set of classes in a WAR file, persistence. xml should be located in the WAR file's WEB-INF/classes/META-INF directory.

Which elements belong to persistence unit in persistence xml?

xml file. This file defines a persistence unit named OrderManagement, which uses a JTA-aware data source jdbc/MyOrderDB. The jar-file and class elements specify managed persistence classes: entity classes, embeddable classes, and mapped superclasses.

What is persistence XML file?

The persistence. xml file is a standard configuration file in JPA. It has to be included in the META-INF directory inside the JAR file that contains the entity beans. The persistence.


1 Answers

The problem is that Persistence.createEntityManagerFactory("abc") is the "do it yourself" API and doesn't take advantage of the Embedded EJB Container. You can get a container managed EntityManager in your test case very easily.

Just as with the related jndi/datasource question I recommend you check out the examples in the examples.zip. They're all designed to take the struggle out of getting started.

Here's a snippet from the testcase-injection example which shows how you can get an EntityManager and other things from the container for use in a test.

First, add an empty ejb-jar.xml or application-client.xml to your test to turn on scanning for your test code:

  • src/test/resources/META-INF/application-client.xml

Then, annotate your test case with @org.apache.openejb.api.LocalClient and use the standard JavaEE annotations for the actual injection.

@LocalClient public class MoviesTest extends TestCase {      @EJB     private Movies movies;      @Resource     private UserTransaction userTransaction;      @PersistenceContext     private EntityManager entityManager;      public void setUp() throws Exception {         Properties p = new Properties();         p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");         p.put("movieDatabase", "new://Resource?type=DataSource");         p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");         p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");          InitialContext initialContext = new InitialContext(p);          // Here's the fun part         initialContext.bind("inject", this);     } 

As movieDatabase is the only DataSource that we've setup, OpenEJB will automatically assign that DataSource to your persistence unit without the need to modify your persistence.xml. You can even leave the <jta-data-source> or <non-jta-data-source> empty and OpenEJB will still know what to do.

But for the sake of completeness, here's how this particular application has defined the persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">    <persistence-unit name="movie-unit">     <jta-data-source>movieDatabase</jta-data-source>     <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>     <class>org.superbiz.testinjection.Movie</class>      <properties>       <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>     </properties>   </persistence-unit> </persistence> 

Then the fun part, using it all together in tests

public void test() throws Exception {      userTransaction.begin();      try {         entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));         entityManager.persist(new Movie("Joel Coen", "Fargo", 1996));         entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998));          List<Movie> list = movies.getMovies();         assertEquals("List.size()", 3, list.size());          for (Movie movie : list) {             movies.deleteMovie(movie);         }          assertEquals("Movies.getMovies()", 0, movies.getMovies().size());      } finally {         userTransaction.commit();     } } 
like image 98
David Blevins Avatar answered Sep 19 '22 22:09

David Blevins