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

乔纳斯·艾希尔(Jonas Eicher)

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

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

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

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

乔纳斯·艾希尔(Jonas Eicher)

这是我如何工作的一小步。请随时提出问题并发表有关如何改善此问题的建议:

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

从现有的jar归档文件创建一个新的插件项目

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

  • 休眠核心-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而不是hibernate会话)
  • org.osgi.core-4.3.1(用于osgi类)
  • jboss日志
  • jboss-transaction-api
  • dom4j-1.6.1
  • antlr-2.7.7

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

Bundle-Activator: org.hibernate.osgi.HibernateBundleActivator (这是来自hibernate-osgi捆绑软件的hibernate捆绑软件激活器)

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

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

另外,请确保您所有的jar都在上,Bundle-Classpath并且插件的所有软件包都已导出

现在,为您的休眠配置和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

打开包含您的实体的插件,并使用您的休眠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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在Eclipse中运行sonarqube插件

来自分类Dev

无法在Eclipse中的Pydev环境中运行Shell脚本

来自分类Dev

Eclipse 中 Java 运行时环境的内存不足

来自分类Dev

如何在Eclipse Buildship插件中运行“ gradle init”任务?

来自分类Dev

JUnitCore在Eclipse插件中给出“无可运行方法”错误

来自分类Dev

运行Eclipse插件的便捷方法

来自分类Dev

运行 Eclipse 插件时出错

来自分类Dev

如何在Aptana Studio Eclipse插件中为Rails服务器设置环境变量?

来自分类Dev

Eclipse中的ANTLR插件

来自分类Dev

一旦在生产环境中运行,如何使基于Packer的映像成为Chef节点?

来自分类Dev

在单独的插件中运行基于模型对象的BIRT报告会导致ClassNotFoundException

来自分类Dev

Eclipse插件开发,长期运行的任务

来自分类Dev

Eclipse插件:启动后立即运行代码

来自分类Dev

Eclipse插件,自定义运行命令

来自分类Dev

Eclipse插件开发,长期运行的任务

来自分类Dev

指定 Eclipse 版本以运行插件

来自分类Dev

启动tomcat7:在Eclipse中运行Maven插件并进行调试

来自分类Dev

如何在启动时自动在Eclipse中运行插件代码?

来自分类Dev

使用Maven无需插件即可在Eclipse中以编程方式运行testNG

来自分类Dev

groovy环境中的flyway gradle插件

来自分类Dev

Eclipse插件中的Lucene NoSuchMethodError

来自分类Dev

如何从插件获取Eclipse的当前语言环境?

来自分类Dev

如何从插件获取Eclipse的当前语言环境?

来自分类Dev

在conda环境中运行pip

来自分类Dev

在“默认”环境中运行命令

来自分类Dev

如何在Android的AIDE中运行基于gradle的Libgdx eclipse项目?

来自分类Dev

如何在设置为在 CI/CD 期间基于环境运行 Selenium 测试 (C#) 的 selenium 脚本中设置 URL

来自分类Dev

如何访问Eclipse插件的Eclipse运行配置的变量解析?

来自分类Dev

将tycho eclipse插件作为Eclipse应用程序运行

Related 相关文章

  1. 1

    无法在Eclipse中运行sonarqube插件

  2. 2

    无法在Eclipse中的Pydev环境中运行Shell脚本

  3. 3

    Eclipse 中 Java 运行时环境的内存不足

  4. 4

    如何在Eclipse Buildship插件中运行“ gradle init”任务?

  5. 5

    JUnitCore在Eclipse插件中给出“无可运行方法”错误

  6. 6

    运行Eclipse插件的便捷方法

  7. 7

    运行 Eclipse 插件时出错

  8. 8

    如何在Aptana Studio Eclipse插件中为Rails服务器设置环境变量?

  9. 9

    Eclipse中的ANTLR插件

  10. 10

    一旦在生产环境中运行,如何使基于Packer的映像成为Chef节点?

  11. 11

    在单独的插件中运行基于模型对象的BIRT报告会导致ClassNotFoundException

  12. 12

    Eclipse插件开发,长期运行的任务

  13. 13

    Eclipse插件:启动后立即运行代码

  14. 14

    Eclipse插件,自定义运行命令

  15. 15

    Eclipse插件开发,长期运行的任务

  16. 16

    指定 Eclipse 版本以运行插件

  17. 17

    启动tomcat7:在Eclipse中运行Maven插件并进行调试

  18. 18

    如何在启动时自动在Eclipse中运行插件代码?

  19. 19

    使用Maven无需插件即可在Eclipse中以编程方式运行testNG

  20. 20

    groovy环境中的flyway gradle插件

  21. 21

    Eclipse插件中的Lucene NoSuchMethodError

  22. 22

    如何从插件获取Eclipse的当前语言环境?

  23. 23

    如何从插件获取Eclipse的当前语言环境?

  24. 24

    在conda环境中运行pip

  25. 25

    在“默认”环境中运行命令

  26. 26

    如何在Android的AIDE中运行基于gradle的Libgdx eclipse项目?

  27. 27

    如何在设置为在 CI/CD 期间基于环境运行 Selenium 测试 (C#) 的 selenium 脚本中设置 URL

  28. 28

    如何访问Eclipse插件的Eclipse运行配置的变量解析?

  29. 29

    将tycho eclipse插件作为Eclipse应用程序运行

热门标签

归档