簡體   English   中英

在OSGi中的Hibernate中創建EntityManagerFactory

[英]Creating a EntityManagerFactory in Hibernate in OSGi

我正在使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)獲取異常; 對我來說,如果我添加行,則沒有任何變化

有人可以幫我找到問題的根源嗎?

PersistenceProvider與您的持久性類和persistence.xml位於不同的包中。 所以看不到這些。

將ContextClassLoader設置為捆綁軟件的類加載器可能會有所幫助。

使用休眠的更好方法是在中間使用Aries JPA。 它以OSGi安全的方式為您創建EntityManagerFactory,並將EMF作為OSGi服務提供。

請參閱Aries JPA示例

還支持使用pax-jdbc-config從配置將DataSource作為服務創建。

答案很簡單:提供者錯誤(或已過時?)。 如果使用Hibernate打印日志,本來會更容易找到:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM