gpt4 book ai didi

java - 带有运行时 pojos 的 Hibernate 的 OSGi 片段包

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:37 26 4
gpt4 key购买 nike

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

对于 hibernate ,我在运行时使用 JAssist 创建 hbm 文件和 pojo。我的代码运行良好,为了进一步模块化,我为每个数据库实现了片段包。这样我的主机包将处理运行时类创建并将它们添加到类加载器、hbm 文件创建逻辑和 BL 中。 fragment 通过传递参数来调用它。

当我为每个数据库创建片段包时,在我的主机包中创建的运行时 pojo 类在我的片段包中可见,我检查了“Thread.currentThread().getContextClassLoader().loadClass()”并能够创建它的实例,

问题是当我从片段包中调用 Hibernate 函数时,我得到“实体未映射”,据我所知,当 Hibernate 无法找到带有表的映射类时,就会出现这些异常。所以我猜 Hibernate 没有找到我的运行时 pojo 类。它可以在主机中找到。

主持人:运行时 Pojo 创建,HBM 和 CFG 创建和更新逻辑提单

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

最佳答案

如果您在多个 bundle 上使用 Hibernate,这个问题总是会出现。在 Hibernate 配置中,您无法分辨在哪个 Bundle 中可以找到映射文件和 pojo 类文件。 Hibernate 不使用 OSGI 为此提供的机制。因此,hibernate 仅查找与 Hibernate 库位于同一包中的映射文件和类。

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

解决这个问题有两种可能:

  1. 忘记您的片段包,将所有 Hibernate 库、映射文件、pojo、使用 Hibernate/HQL 的所有数据库类放入一个包中。使用不同的hibernate.cfg.xml文件时可以切换不同的数据库;每个数据库都有自己的配置文件。这些 hibernate.cfg.xml 文件可以在包之外。

  2. 编写你自己的扩展 org.hibernate.cfg.Configuration 的配置类,在这个类中你必须

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

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

关于java - 带有运行时 pojos 的 Hibernate 的 OSGi 片段包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com