最近,我一直在尝试将Hibernate用作基于Eclipse捆绑包的项目的OR-Mapper 。
由于Eclipse捆绑包具有独特的类加载功能,因此许多人建议使用Eclipselink而不是Hibernate。
尝试过Eclipselink并对其不太满意之后,我想知道:
是否没有办法在我的Eclipse插件项目中启动并运行Hibernate?
这是我如何工作的一小步。请随时提出问题并发表有关如何改善此问题的建议:
下载带有OSGi支持的Hibernate 4.2.5或更高版本(请参阅Hibernate OSGi文档)。但是,那里的示例使用Apache Felix作为OSGi实现而不是春分。
从现有的jar归档文件创建一个新的插件项目。
就我而言,我添加了以下罐子:
打开项目的MANIFEST.MF并添加以下内容:
Bundle-Activator: org.hibernate.osgi.HibernateBundleActivator
(这是来自hibernate-osgi捆绑软件的hibernate捆绑软件激活器)
Bundle-ActivationPolicy: lazy
(以便osgi在激活后将上下文传递给包)
Eclipse-BuddyPolicy: registered
(我们稍后需要使用它来使我们的实体类已知为休眠状态,反之亦然)
另外,请确保您所有的jar都在上,Bundle-Classpath
并且插件的所有软件包都已导出。
现在,为您的休眠配置和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
打开包含您的实体的插件,并使用您的休眠jar(我们创建的第一个)向插件添加依赖项。
现在,我们还需要在带有休眠jar的插件中知道这些实体。我们不能在此处添加依赖项,因为这会产生循环依赖项。幸运的是,Eclipse为我们提供了一种解决方法:
打开您的实体捆绑包的MANIFEST.MF并将您的hibernate-jar插件注册为好友:
Eclipse-RegisterBuddy: org.hibernate4.osgi
(您的hibernate插件的名称,即您设置Eclipse-Buddy-Policy的名称:已注册)
现在,Hibernate知道我们的班级,而我们的班级也知道Hibernate。我们还确保Hibernate找到了persistence.xml(或hibernate.cfg.xml)并创建了易于配置的EntityMangerFactory
(或Session)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句