最近,我一直在尝试将Hibernate用作基于Eclipse包的项目的 OR-Mapper。
由于 Eclipse 捆绑包的独特类加载,许多人建议使用Eclipselink而不是 Hibernate。
尝试了 Eclipselink 并且对它不太满意,我确实想知道:
没有办法让Hibernate在我的Eclipse 插件项目中启动并运行吗?
最近,我一直在尝试将Hibernate用作基于Eclipse包的项目的 OR-Mapper。
由于 Eclipse 捆绑包的独特类加载,许多人建议使用Eclipselink而不是 Hibernate。
尝试了 Eclipselink 并且对它不太满意,我确实想知道:
没有办法让Hibernate在我的Eclipse 插件项目中启动并运行吗?
这是我如何让它工作的一个小演练。请随时提出问题并发布有关如何改进此问题的建议:
下载带有 OSGi 支持的 Hibernate 4.2.5 或更新版本(请参阅Hibernate OSGi 文档)。但是,那里的示例使用 Apache Felix 作为 OSGi 实现,而不是 equinox。
从现有的 jar-archives创建一个新的插件项目。
就我而言,我添加了以下罐子:
打开项目的MANIFEST.MF并添加以下内容:
Bundle-Activator: org.hibernate.osgi.HibernateBundleActivator
(这是来自 hibernate-osgi 包的休眠包激活器)
Bundle-ActivationPolicy: lazy
(以便 osgi 在激活后将上下文传递给包)
Eclipse-BuddyPolicy: registered
(我们稍后需要它来使我们的实体类知道休眠,反之亦然)
还要确保你所有的 jars 都在并且插件的Bundle-Classpath
所有包都已导出。
现在,为您的 hibernate 配置和 DAO 创建一个新的插件项目。
将持久性配置文件(persistence.xml
或hibernate.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 类中,使用以下代码获取EntityManagerFactory
or 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)。