【问题标题】:tomee - how to use RESOURCE_LOCAL datasourcetomee - 如何使用 RESOURCE_LOCAL 数据源
【发布时间】:2016-07-05 15:16:11
【问题描述】:

我有一些可以使用 JTA 的类(ejb、webservices、mdb 等)。对于某些课程,我需要RESOURCE_LOCAL(不能注入)。但是我无法让 tomee 引用 RESOURCE_LOCAL 的 jndi 名称。你如何设置 tomee 和RESOURCE_LOCAL?我似乎在网上找不到一个很好的例子,我不想在我的persistence.xml 文件中放入任何用户名和密码。

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>

我在EntityManagerFactory 查找中使用名称MYDS,但出现此错误:

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)

【问题讨论】:

  • 这是什么版本的 TomEE?
  • 7.0.1 和 7.0.1(最新 2 个版本)

标签: jpa jta apache-tomee tomee-7


【解决方案1】:

解决方案似乎是这样的(仍在验证): (不是很直观或记录在案,将 openejb:Resource 添加到 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>    

【讨论】:

    【解决方案2】:

    如何获得持久性单元?手动?

    如果使用注入:

    @PersistenceUnit EntityManagerFactory emf;
    @PersistenceContect EntityManager em;
    

    TomEE 从它的短名称(tomee.xml 中的 id)为您解析数据源,否则您需要为其提供完整的 JNDI 名称,我认为它是 java:openejb/Resource/MYDS

    【讨论】:

    • 是的,我正在注入 EnityManager,问题似乎是 JTA 与 RESOURCE_LOCAL 的不同 jndi 命名方案(来自我上面的回答)。我认为这是新版本或错误,因为我记得旧版本的 tomee 使用相同的 jndi 类型字符串
    • JTA 应该由 tomee 提供,其中非 JTA 很可能由 hibernate 查找,具体取决于版本和配置,即使 tomee 仍然将它提供给提供者(hibernate 似乎忽略了它,因为它调用 JndiServiceImpl)。
    猜你喜欢
    • 2011-12-22
    • 2015-09-08
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多