2016-07-05 2 views
0

У меня есть несколько классов (ejb, webservices, mdb и т. Д.), Которые могут использовать JTA. Для некоторых классов мне нужно RESOURCE_LOCAL (не может быть введено). Однако я не могу заставить tomee ссылаться на имя jndi RESOURCE_LOCAL. Как вы настраиваете tomee и RESOURCE_LOCAL? Я не могу найти один хороший пример в Интернете, я бы предпочел не добавлять в файл persistence.xml имена пользователей и пароли.tomee - как использовать источник данных RESOURCE_LOCAL

tomee.xml имеет это:

<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 выглядит следующим образом:

<?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> 

Я использую имя MYDS в EntityManagerFactory поиска, но получаю эту ошибку:

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

какая версия TomEE это? –

+0

7.0.1 и 7.0.1 (последние 2 версии) – user18896654353

ответ

2

решение кажется быть этим (все еще проверяющим): (не очень intuative или документально, добавив OpenEJB: Ресурс для JPA и JPA не работает, удалением его из RESOURCE_LOCAL и RESOURCE_LOCAL не работает)

<?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

спасибо! Это спасло мой день. – npocmaka

0

как вы получите ваш блок настойчивость? Вручную?

При использовании инъекции:

@PersistenceUnit EntityManagerFactory emf; 
@PersistenceContect EntityManager em; 

TomEE устраняющего источник данных для вас от своего короткого имени (идентификатор tomee.xml) в противном случае вы должны дать ему полное имя JNDI, который я думаю, что это Java: OpenEJB/Ресурс/MYDS

+0

yes Я вводил EnityManager, кажется, что разные схемы именования jndi для JTA против RESOURCE_LOCAL (из моего ответа выше). Я думаю, что это ново или ошибка со старых версий tomee, которые я помню, используя одну и ту же строку типа jndi. – user18896654353

+0

. JTA-файл должен быть предоставлен tomee, где не-JTA-файл может быть просмотрен с помощью hibernate в зависимости от версии и конфигурации, даже если tomee по-прежнему предоставляет его провайдеру (спящий режим игнорирует его, поскольку он вызывает JndiServiceImpl). –

Смежные вопросы