web-dev-qa-db-fra.com

Que mettre dans jta-data-source de persistence.xml?

Quelle valeur dois-je mettre dans <jta-data-source> de mon persistence.xml?

Dans le panneau d'administration de glassfish, j'ai créé un nom de source de données "abcDS". Dans mon jndi.properties (à l'intérieur src/test/resources) Je l'ai défini comme ceci:

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

Que dois-je placer dans persistence.xml? J'ai trouvé beaucoup de variantes sur le Net, comme: "jdbc/abcDS", "Java:/abcDS", "abcDS". Lequel a raison? Et y a-t-il une règle pour cela? Je comprends que c'est lié à JNDI, mais ...

J'essaie de créer EMF dans mon test unitaire:

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

Voici ce que je reçois dans le journal:

[...]
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)
[...]
34
yegor256

Le problème est que Persistence.createEntityManagerFactory("abc") est l'API "do it yourself" et ne tire pas parti du conteneur EJB intégré. Vous pouvez obtenir un conteneur géré EntityManager dans votre scénario de test très facilement.

Tout comme pour la question jndi/datasource connexe, je vous recommande de consulter les exemples dans examples.Zip . Ils sont tous conçus pour éliminer la difficulté de commencer.

Voici un extrait du testcase-injection exemple qui montre comment obtenir un EntityManager et d'autres éléments du conteneur pour les utiliser dans un test.

Tout d'abord, ajoutez un ejb-jar.xml ou application-client.xml vide à votre test pour activer la recherche de votre code de test:

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

Ensuite, annotez votre scénario de test avec @org.Apache.openejb.api.LocalClient et utilisez les annotations JavaEE standard pour l'injection réelle.

@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);
    }

Comme movieDatabase est le seul DataSource que nous avons configuré, OpenEJB attribuera automatiquement ce DataSource à votre unité de persistance sans avoir besoin de modifier votre persistence.xml. Vous pouvez même quitter le <jta-data-source> ou <non-jta-data-source> vide et OpenEJB saura toujours quoi faire.

Mais par souci d'exhaustivité, voici comment cette application particulière a défini le 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>

Ensuite, la partie amusante, en utilisant tout cela ensemble dans les 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();
    }
}
37
David Blevins