最近,我一直在尝试将 Hibernate 用作基于 Eclipse 捆绑包的项目的O-R-Mapper。
由于Eclipse-bundle的独特类加载,许多人建议使用 Eclipselink 而不是Hibernate。
尝试过Eclipselink并对它不太满意后,我想知道:
是否有办法在 Eclipse插件项目中启动并运行 Hibernate ?
答案 0 :(得分:2)
以下是我如何使用它的一个小小的演练。请随时提出问题并发布有关如何改进的建议:
下载Hibernate 4.2.5或更新版本,它附带OSGi-Support(参见Hibernate OSGi Documentation)。但是,那里的例子使用Apache Felix作为OSGi实现而不是equinox。
从现有的jar-archives 创建一个新的插件项目。
就我而言,我添加了以下罐子:
打开项目的 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.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
或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
打开包含您的实体的插件,并使用您的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
(或会话)。