2

最近,我一直在尝试将Hibernate用作基于Eclipse包的项目的 OR-Mapper。

由于 Eclipse 捆绑包的独特类加载,许多人建议使用Eclipselink而不是 Hibernate。

尝试了 Eclipselink 并且对它不太满意,我确实想知道:

没有办法让Hibernate在我的Eclipse 插件项目中启动并运行吗?

4

1 回答 1

2

这是我如何让它工作的一个小演练。请随时提出问题并发布有关如何改进此问题的建议:

下载带有 OSGi 支持的 Hibernate 4.2.5 或更新版本(请参阅Hibernate OSGi 文档)。但是,那里的示例使用 Apache Felix 作为 OSGi 实现,而不是 equinox。

从现有的 jar-archives创建一个新的插件项目

就我而言,我添加了以下罐子:

  • 休眠核心4.2.5
  • 休眠-osgi-4.2.5
  • hibernate-commons-annotations-4.0.2(我正在使用注释)
  • hibernate-jpa-2.0(我正在使用 java persistence api 以获得更大的灵活性)
  • hibernate-entitymanager-4.2.5(也是更通用的 jpa entitymanager 而不是休眠会话)
  • org.osgi.core-4.3.1(用于 osgi 类)
  • jboss日志
  • jboss-事务-api
  • dom4j-1.6.1
  • antlr-2.7.7

打开项目的MANIFEST.MF并添加以下内容:

Bundle-Activator: org.hibernate.osgi.HibernateBundleActivator(这是来自 hibernate-osgi 包的休眠包激活器)

Bundle-ActivationPolicy: lazy(以便 osgi 在激活后将上下文传递给包)

Eclipse-BuddyPolicy: registered(我们稍后需要它来使我们的实体类知道休眠,反之亦然)

还要确保你所有的 jars 都在并且插件的Bundle-Classpath所有包都已导出

现在,为您的 hibernate 配置和 DAO 创建一个新的插件项目。

将持久性配置文件(persistence.xmlhibernate.cfg.xml)放在插件根目录的META-INF文件夹中。这是一个示例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="TheNameOfMyPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <description>My Persistence Unit</description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>de.eicher.jonas.SomeClass</class>
        <class>de.eicher.jonas.AnotherClass</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
            <property name="hibernate.connection.url" value="jdbc:derby:C:/Temp/data;create=true"/>
            <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.connection.password" value=""/>
            <property name="org.hibernate.FlushMode" value="commit" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <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>

添加org.eclipse.core.runtime到您的依赖项并创建一个Activator以获取对以下内容的静态访问BundleContext

import org.eclipse.core.runtime.Plugin;
import org.osgi.framework.BundleContext;

public class HibernateJpaActivator extends Plugin {

    private static BundleContext context;

    @Override
    public void start(BundleContext context)
        throws Exception {
        HibernateJpaActivator.context = context;
    }

    public static BundleContext getContext() {
        return context;
    }
}

在您的 DAO 或 Util 类中,使用以下代码获取EntityManagerFactoryor EntityManager

BundleContext context =  HibernateJpaActivator.getContext(); 
ServiceReference serviceReference = context.getServiceReference( PersistenceProvider.class.getName() );
PersistenceProvider persistenceProvider = (PersistenceProvider) context.getService( serviceReference );
emf = persistenceProvider.createEntityManagerFactory( "TheNameOfMyPersistenceUnit", null );
EntityManager em = emf.createEntityManager();

在它起作用之前,只需要做几件事:

打开MANIFEST.MF并确保您的包收到BundleContext激活。

Bundle-ActivationPolicy: lazy
Bundle-Activator: my.package.name.HibernateJpaActivator

打开包含您的实体的插件并使用您的休眠 jars(我们创建的第一个)向插件添加依赖项。

现在我们还需要在带有休眠 jar 的插件中知道实体。我们不能在那里添加依赖,因为这会产生循环依赖。幸运的是,Eclipse 为我们提供了一种解决方法:

打开实体包的 MANIFEST.MF 并将您的 hibernate-jar 插件注册为好友

Eclipse-RegisterBuddy: org.hibernate4.osgi(你的休眠插件的名称,你设置 Eclipse-Buddy-Policy: 注册的那个)

现在 Hibernate 知道我们的类,我们的类也知道 Hibernate。我们还确保 Hibernate 找到我们的persistence.xml(或 hibernate.cfg.xml)并创建我们易于配置的EntityMangerFactory(或 Session)。

于 2013-09-16T16:31:43.817 回答