在基于Eclipse插件的环境中运行Hibernate

时间:2013-09-16 16:31:44

标签: eclipse hibernate jpa plugins persistence

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

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

尝试过Eclipselink并对它不太满意后,我想知道:

是否有办法在 Eclipse插件项目中启动并运行 Hibernate

1 个答案:

答案 0 :(得分:2)

以下是我如何使用它的一个小小的演练。请随时提出问题并发布有关如何改进的建议:

下载Hibernate 4.2.5或更新版本,它附带OSGi-Support(参见Hibernate OSGi Documentation)。但是,那里的例子使用Apache Felix作为OSGi实现而不是equinox。

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

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

  • 冬眠核-4.2.5
  • 冬眠-OSGi的4.2.5
  • hibernate-commons-annotations-4.0.2(我正在使用注释)
  • hibernate-jpa-2.0(我使用java持久性api以获得更大的灵活性)
  • hibernate-entitymanager-4.2.5(也是更通用的jpa entitymanager而不是hibernates会话)
  • 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包的hibernate的bundle激活器)

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

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

另外,请确保所有广告素材都在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类中,使用以下代码获取EntityManagerFactoryEntityManager

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

打开包含您的实体的插件,并使用您的hibernate jar(我们创建的第一个)为插件添加依赖项。

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

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

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

现在Hibernate知道我们的类,我们的类知道Hibernate。我们还确保Hibernate找到我们的 persistence.xml (或hibernate.cfg.xml)并创建我们随时配置的EntityMangerFactory(或会话)。