2016-07-05 4 views
0

J'ai quelques classes (ejb, webservices, mdb, etc ..) qui peuvent utiliser JTA. Pour certaines classes, j'ai besoin de RESOURCE_LOCAL (ne peut pas être injecté). Cependant, je ne peux pas obtenir tomee pour faire référence au nom jndi de RESOURCE_LOCAL. Comment configurer tomee et RESOURCE_LOCAL? Je n'arrive pas à trouver un bon exemple en ligne, je préférerais ne pas mettre de noms d'utilisateur et de mots de passe dans mon fichier persistence.xml.tomee - comment utiliser la source de données RESOURCE_LOCAL

tomee.xml a ceci:

<Resource id="MYDS" type="DataSource"> 
     JdbcDriver com.mysql.jdbc.Driver 
     JdbcUrl jdbc:mysql://127.0.0.1:3306/maestro 
     UserName myusername 
     Password mypassword 
     JtaManaged false 
</Resource> 

persistence.xml ressemble:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name = "MYDS" transaction-type = "RESOURCE_LOCAL">  
     <provider>org.hibernate.ejb.HibernatePersistence</provider>   
      <non-jta-data-source>MYDS</non-jta-data-source> 
    </persistence-unit>   
</persistence> 

J'utilise le nom MYDS dans EntityManagerFactory recherche, mais je reçois cette erreur:

Caused by: org.hibernate.engine.jndi.JndiException: Unable to lookup JNDI name [MYDS] 
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:117) 
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:115) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) 
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) 
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75) 
    ... 36 more 
Caused by: javax.naming.NameNotFoundException: Name [MYDS] is not bound in this Context. Unable to find [MYDS]. 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:817) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:160) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:828) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:160) 
+0

quelle est la version de TomEE? –

+0

7.0.1 et 7.0.1 (dernières versions 2) – user18896654353

Répondre

2

la solution semble être ceci (toujours en train de vérifier): (pas très intuative ou documenté, ajoutant OpenEJB: ressources à JPA et JPA ne fonctionne pas, le retirer de RESOURCE_LOCAL et RESOURCE_LOCAL ne fonctionne pas)

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name = "MYDS" transaction-type = "RESOURCE_LOCAL">  
     <provider>org.hibernate.ejb.HibernatePersistence</provider>   
      <non-jta-data-source>openejb:Resource/MYDS</non-jta-data-source> 
    </persistence-unit>   
    <persistence-unit name="MYDSJPA" transaction-type = "JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>MYDS</jta-data-source>    
     </properties> 
    </persistence-unit> 
</persistence>  
+0

merci! Cela a sauvé ma journée. – npocmaka

0

comment obtenez-vous votre unité de persistance? Manuellement?

Si vous utilisez l'injection:

@PersistenceUnit EntityManagerFactory emf; 
@PersistenceContect EntityManager em; 

tomee résout la source de données pour vous de son nom court (id dans tomee.xml) sinon vous devez lui donner le nom complet JNDI que je pense est java: OpenEJB/Resource/MYDS

+0

oui J'injecte l'EnityManager, le problème semble être différent des schémas de nommage jndi pour JTA vs RESOURCE_LOCAL (d'après ma réponse ci-dessus). Je pense que c'est nouveau ou un bug depuis les anciennes versions de tomee je me souviens d'utiliser la même chaîne de caractères jndi – user18896654353

+0

Le JTA doit être fourni par tomee où le non JTA peut probablement être recherché par hibernate selon la version et la config même si tomee le fournit toujours au fournisseur (hibernate l'ignore il semble qu'il appelle JndiServiceImpl). –