当前位置: 首页 > 面试题库 >

带有运行时pojos的Hibernate的OSGi Fragment捆绑软件

万勇
2023-03-14
问题内容

我的要求是使用hibernate映射各种数据库(尤其是SQL Server,MySQl和Postgres);从db记录创建一个xml文件。

对于hibernate,我正在使用JAssist在运行时创建hbm文件和pojos。我的代码很棒,为了进一步模块化,我为每个数据库实现了片段捆绑包,以便我的主机捆绑包可以处理运行时类的创建并将其添加到类加载器,hbm文件创建逻辑和BL中。片段通过传递html" target="_blank">参数来调用它。

当我为每个数据库创建一个片段束时,在我的片段束中可以看到在主机束中创建的运行时pojo类,我使用“
Thread.currentThread()。getContextClassLoader()。loadClass()”进行了检查并能够创建其实例,

问题是,当我从片段捆绑中调用Hibernate函数时,我收到“未映射实体”,AFAIK当hibernate无法找到具有表的映射类时,将出现这些异常。所以我猜Hibernate没有找到我的运行时pojo类。它可以在主机中找到。

主机:运行时Pojo创建,HBM和CFG创建以及更新逻辑BL

片段:Hibernate层,调用Hibernate函数,XML创建逻辑


问题答案:

如果您在多个捆绑包中使用了Hibernate,则始终会出现此问题。在Hibernate配置中,您无法确定可以在哪个Bundle中找到映射文件和pojo类文件。Hibernate不使用OSGI为此提供的机制。结果,hibernate仅查找与Hibernate库位于同一包中的映射文件和类。

我不知道是否存在针对此问题的专业解决方案(第三方产品)。

有两种方法可以解决此问题:

  1. 忘记片段捆绑包,并将所有数据库的使用Hibernate / HQL的所有Hibernate库,映射文件,pojos,类放入单个捆绑包中。当您使用不同的hibernate.cfg.xml文件时,可以在不同的数据库之间进行切换。每个数据库都有其自己的配置文件。这些hibernate.cfg.xml文件可以位于捆绑软件之外。

  2. 编写扩展org.hibernate.cfg.Configuration的您自己的Configuration类,在该类中,您必须

    • 编写自己的类加载器,即使在其他包中也可以找到pojo类
    • 覆盖addResource(String resourceName,ClassLoader classLoader)的方式也可以在其他包中查找资源
    • 覆盖doConfigure和buildSessionFactory,以便它们使用您的类加载器而不是标准类加载器(使用Thread.setContextClassLoader并从超类(即从标准Hibernate Configuration类)调用该方法)。
    • 覆盖所有其他其他返回Configuration实例的方法,以便它们返回Configuration类而不是Hibernate Configuration类的实例。

我们做了解决方案2。这虽然有点工作,但是现在运行良好。(以为,当再次更改Hibernate版本时,可能需要做一些工作。)



 类似资料:
  • 正在下载.../DLL的/Dotnetzip.dll(458 KB)下载对象时出错:.../DLL的/Dotnetzip.dll(7DD20A2):Smudge错误:下载错误.../DLL的/Dotnetzip.dll(7DD20A2291B05323BBA04BE4AE656D7635AE5E68A5A6FA2B9F86E27841846A31):批处理请求:缺少协议:“C:/...bundle

  • 在用户需要安装jre才能运行aps之前: 现在随着jlink和jpack的发布,可以使用捆绑的jre部署jars。 启动另一个的正确方法是什么。jar来自使用jlink/jpackage部署的程序? 将无法工作,因为最终用户不再安装java 请参阅:如何从命令行调用嵌入式jre以运行java应用程序 这是一个类似的问题,但没有解决创建。带jlink/J包的jar

  • 问题内容: 我正在尝试在Eclipse中创建一个简单的插件。运行应用程序时,我在日志文件中看到此错误: org.osgi.framework.BundleException:捆绑包org.xy的激活器捆绑包org.xy的激活器无效。 您对此错误有任何想法吗? 问题答案: 检查你的 部分 如果未正确指定最终二进制结果中应包含的内容,它将无法正常工作。检查.class文件是否在MANIFEST.MF所

  • 我有几个OSGi捆绑包,它们是在Eclipse中使用普通清单管理依赖项和Maven Tycho的外部构建构建构建的。 在Equinox上运行Eclipse内部的捆绑包工作正常。用第谷建造它们效果很好。 现在我想使用Tycho Surefire运行集成测试,为此我创建了一个简单的测试包,其中包含一些基本测试。测试中的bundle依赖于OSGi容器中的其他bundle和一些小的启动级别调整,以便正确运

  • 问题内容: 我正在尝试使用将.jar捆绑到MacOSX应用程序捆绑中。 我正在关注本教程。 它说要在高级项目目录中添加一个文件夹,但是我不知道这意味着什么。我一直在到处寻找它,但是我找不到它。这是我唯一的问题,有人知道吗? 编辑: 这是我的文件: 谢谢! 问题答案: 好吧,所以,经过一番游戏之后,这就是我的理解… 下载Java Application Bundler并将其放置在项目目录中。您将需要

  • 问题内容: 是否可以在运行时创建hibernate的Entity类(带有注释)?它应与也在运行时中添加的表相关。重要的是,该实体应该对Hibernate可见。一般情况下是否可能,请您给我有关该问题的任何建议吗?我了解,反射是关键字,但需要更多的单词。问候。 问题答案: 在这种情况下,您可能希望在运行时以编程方式创建Hibernate Session Factory,并传入创建的新映射,请访问htt