【问题标题】:Creating a EntityManagerFactory in Hibernate in OSGi在 OSGi 的 Hibernate 中创建 EntityManagerFactory
【发布时间】:2017-11-30 01:38:37
【问题描述】:

我正在让 Hibernate 与 OSGi 一起工作,所以这个项目的基础是 org.hibernate.osgi

我创建了以下persistence.xml

<persistence 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 persistence_2_1.xsd"
    version="1.0">
    <persistence-unit name="DemoUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
            <property name="hibernate.connection.driver_class" value="org.h2.Driver" />
            <property name="hibernate.connection.username" value="sa" />
            <property name="hibernate.connection.password" value="" />
            <property name="hibernate.connection.url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" />

            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="org.hibernate.FlushMode" value="commit" />
            <property name="hibernate.current_session_context_class" value="thread" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

我尝试使用以下代码访问它:

    BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
    ServiceReference serviceReference = context.getServiceReference(PersistenceProvider.class.getName());
    PersistenceProvider persistenceProvider = (PersistenceProvider) context.getService(serviceReference);
    EntityManagerFactory emf = persistenceProvider.createEntityManagerFactory("DemoUnit", null);

之后,EntityManagerFactory 为空。没有例外,没有日志,什么都没有。

我知道的:

  • 插件读取persistence.xml,如果格式错误则失败
  • 插件可以访问org.h2.Driver,因为我可以导入它
  • 一些来源声明使用 Log4J 和 Logger.getLogger("org").setLevel(Level.ALL) 之类的东西来获取异常;对我来说,如果我添加该行,则没有任何变化

谁能帮我找出问题的根源?

【问题讨论】:

标签: hibernate jpa osgi


【解决方案1】:

PersistenceProvider 与持久性类和persistence.xml 位于不同的包中。所以它看不到这些。

将 ContextClassLoader 设置为包的类加载器可能会有所帮助。

使用hibernate的更好方法是在中间使用Aries JPA。它以 OSGi 安全的方式为您创建 EntityManagerFactory,并将 EMF 作为 OSGi 服务提供。

请参阅Aries JPA examples

还支持使用 pax-jdbc-config 从配置创建 DataSource 作为服务。

【讨论】:

    【解决方案2】:

    答案很简单:提供者是错误的(或过时的?)。如果 Hibernate 打印日志会更容易找到:

    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 2017-03-05
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多