千家信息网

Hibernate和模型对象怎么理解

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"Hibernate和模型对象怎么理解",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Hibernate和模型对象怎么理解"吧!学习H
千家信息网最后更新 2026年11月03日Hibernate和模型对象怎么理解

这篇文章主要讲解了"Hibernate和模型对象怎么理解",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Hibernate和模型对象怎么理解"吧!

学习Hibernate时,经常会遇到一些小问题,这里将介OSGi平台的插件类加载机制使得Hibernate无法正确加载分布在不同插件内部的模型对象与O/R映射文件问题的解决方法。

OpenCore是在OSGi规范上构建的微内核(Microkenerl),基于纯组件(Pure Plugin)开放源码企业应用软件平台。

OpenCore数据层实现OSGi上集成Hibernate,Hibernate及其依赖库作为一个单独的插件,这样带来一个问题,就是OSGi平台的插件类加载机制使得Hibernate无法正确加载分布在不同插件内部的模型对象与O/R映射文件。本文讨论解决方案:

模型对象(Domain Objects)插件

模型对象(Domain Objects)集中到独立的插件(Bundle)内,Hibernate插件依赖这些模型对象插件。这是最简单的,也是比较糟糕的方式,比较小的基于OSGi的项目可以这也作做。

Eclipse-BuddyPolicy与Eclipse-RegisterBuddy方式

Equinox(Eclipse提供的OSGi实现)平台特有的方式,允许插件(Bundle)声明自己的伙伴,让"伙伴插件"来动态加载本插件的类,这也是Hiberate与Equinox集成的官方解决方案。这种方式模型对象无需部署在单独的插件内,与业务插件部署在一起即可,Hibernate插件也无须依赖模型对象。

具体做法如下:

首先,Hibernate插件(名称,例如org.opengoss.orm.hibernate)声明自身可以作为伙伴插件,自描述文件(MANIFEST.MF) 加入描述:Eclipse-BuddyPolicy: registered

然后,模型对象的业务插件中把Hibernate插件加入为伙伴,自描述文件(MANIFEST.MF) 加入描述:Eclipse-RegisterBuddy:org.opengoss.orm.hibernate

Eclipse Extension Point方式

这是我们目前实现的方式,通过标准的Eclipse扩展点与扩展机制,我们在Hibernate插件中plugin.xml配置文件中声明下述扩展点,在模型对象插件中声明扩展,例如:

Hibernate插件的启动中,用代码配置生成SessionFactory,代码如下:

  1. public void start(BundleContext context) throws Exception {

  2. Configuration configuration = new Configuration().configure
    (new File ("./etc/org.opengoss.database.hibernate/hibernate.cfg.xml"));

  3. Class[] domainClasses = getDomainClasses();

  4. for (Class domainClass : domainClasses) {

  5. configuration.addClass(domainClass);

  6. }

  7. sessionFactory = configuration.buildSessionFactory();

  8. Dictionarynew Hashtable props.put("scope", "APPLICATION");

  9. props.put("uid", "Hibernate:SessionFactory");

  10. registration = context.registerService
    (SessionFactory.class.getName(), sessionFactory, props);

  11. }

  12. private Class[] getDomainClasses() throws Exception {

  13. List domainClasses = new ArrayList();

  14. IExtensionPoint point = registry.getExtensionPoint
    (IConstants.DOMAIN_OBJECT_EXTENSION_POINT);

  15. IExtension[] extensions = point.getExtensions();

  16. for (IExtension extension : extensions) {

  17. IConfigurationElement[] elements = extension.getConfigurationElements();

  18. for (IConfigurationElement configurationElement : elements) {

  19. Bundle bundle = pluginContext.getBundleBySymbolId
    (extension.getNamespaceIdentifier());

  20. Class domainClass = bundle.loadClass
    (configurationElement.getAttribute("class"));

  21. domainClasses.add(domainClass);

  22. }

  23. }

  24. return domainClasses.toArray(new Class[domainClasses.size()]);

  25. }

注意:Hibernate内部的类加载机制实在无法令人满意,尽管我们在这种方式中已经加载所有的模型类对象,但Hibernate内部仍然会调用Class.forName()去试图加载。

感谢各位的阅读,以上就是"Hibernate和模型对象怎么理解"的内容了,经过本文的学习后,相信大家对Hibernate和模型对象怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

插件 对象 模型 方式 文件 伙伴 平台 机制 问题 学习 不同 业务 代码 内容 就是 方案 解决方案 这是 配置 糟糕 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡豆 精品咖啡豆 广东万易互联网科技有限公司惠州分公司 南京欣网互联网络科技有限公司 科技互联网产品 郑州华宇互联网科技 蓝色互联网科技 互联网科技公司需要的职位 现代科技和互联网有关系吗 现代互联网科技股 乌鲁木齐新华智原互联网科技学校 深圳无忧互联网科技 江苏互联网科技小贷 广州互联网高科技取餐柜 扫呗互联网科技有限公司 陕西九四连强互联网科技有限公司 长沙渺峰互联网科技有限公司 互联网领先科技活动 福仕德教育科技互联网 绵阳真晨互联网科技有限公司 深圳恒合互联网络科技有限公司 深圳齐家互联网科技 互联网 视角下的科技创新 互联网高科技股票 科技大学互联网专业好不好 西藏七维空间互联网科技有限公司 银川新华互联网科技职业技术培训学校图片 重庆互联网医院沙龙医盟信息科技 佛山市翊博互联网络科技有限公司 深圳市罗太互联网科技有限公司
0