Spring Hibernate:重新加载实体映射

2024-04-26

在 Web 应用程序中,我们使用 Spring 3.2 和 Hibernate 4.1.1 并实现类似插件的架构。 可以在运行时添加和删除插件。 对于每个模块,我们定义了一个单独的类加载器,并在 spring 上创建单独的子应用程序上下文。 完整的配置是使用注释完成的,bean 不再需要 XML 配置。

Spring Hibernate配置类

@Configuration
@EnableTransactionManagement
public class HibernateConfigurationFactory {

@Bean
public JndiObjectFactoryBean dataSource() {
    JndiObjectFactoryBean ds = new JndiObjectFactoryBean();
    ds.setJndiName("java:jboss/datasources/OurOwnDS");
    ds.setResourceRef(true);
    return ds;
}

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setPackagesToScan("com.foo.bar");
    sessionFactory.setDataSource((DataSource) dataSource().getObject());

    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.hbm2ddl.auto", "update");

    sessionFactory.setHibernateProperties(hibernateProperties);

    return sessionFactory;
}

@Bean
public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());
    return transactionManager;
}

}

现在问题是: 一些插件包含自己的实体(+DAO)类,这些类在运行时随模块添加。

是否可以在 hibernate 上创建某种单独的上下文(就像我们在 spring 上所做的那样),甚至添加/重新加载其他实体类?

重新加载 EntityManager 可以满足我的需求吗? 但是上下文中已经加载的实体会发生什么?

感谢您提前提供任何帮助和评论。

Update:实际上我做了以下操作并解决了问题(但后来遇到了另一个问题......)。

我为每个模块/上下文创建一个新的 DataSource + SessionFactory + TransactionManager 并将它们插入到新的子 ApplicationContext 中。 现在,我使用类加载器扫描所有带注释的类,并使用以下命令在应用程序上下文和会话工厂上手动注册它们

LocalSessionFactorybean#setAnnotatedClasses(...)

这工作得很好……但是……

下一个问题:我收到 ClassNotFoundException ,这似乎是类加载器问题。 Hibernate使用系统类加载器而不是我自己的pluginClassloader。

有人知道如何将自己的类加载器注入到 Hibernate 中吗?


注射是否可行Environment并将其用作 Hibernate 资源的额外来源?

@Configuration
@EnableTransactionManagement
public class HibernateConfigurationFactory {

    @Autowired
    Environment env;

    @Bean 
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setPackagesToScan("com.foo.bar");
        if (env.containsProperty("some.extra.classes.property") {
            sessionFactory.setAnnotatedClasses(some extrapolation here);
            // Or similarly add extra packages for scanning
            ...
        }
    }
}

至于额外的 DAO beans,你可以使用@Profile http://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile/为此,或者 - 如果使用 Spring 4 - 使用@条件 http://docs.spring.io/spring/docs/4.0.x/javadoc-api/org/springframework/context/annotation/Conditional.html.

EDIT

The Environment不是你创造的东西,它是“为你而存在”。它基本上是属性源和配置文件集的容器。

一个很好的参考点是 Spring 参考文档,即 IoC 容器章节。您也可以查看 SpringSource 博客。 Chris Beams 写的与 Spring 3.1 相关的好文章很少,但大部分内容都在那里。

例如,您可以使用如下内容来引导子应用程序上下文:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
ConfigurableEnvironment environment = context.getEnvironment();

// this is how you set different properties per a sub context. 
Map subContextMap = new HashMap();
subContextMap.put("some.extra.classes.property", [unique value here]);
environment.getPropertySources().addFirst(new MapPropertySource("SUB_CTX_MAP", subContextMap);

// this is the generic configuration class(es).
context.register(HibernateConfigurationFactory.class);

context.refresh();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Hibernate:重新加载实体映射 的相关文章

随机推荐

  • 为什么 MYSQL DB 在对 Django models.DateTimeField 求平均值时返回损坏的值?

    我正在 MySQL 实际上是 MariaDB 数据库上运行 Django 应用程序 我的 Django 模型如下所示 from django db import models from django db models import Avg
  • 在可移植 C 中模拟打包结构

    我有以下结构 typedef struct Octree uint64 t data uint8 t alignas 8 alloc uint8 t dataalloc uint16 t size datasize node0 Node8
  • Delphi COM 对象中的早期绑定和后期绑定在性能方面哪个更好

    在delphi中 如果要创建COM对象 可以通过两种方式来完成 第一个是早期绑定 例如 uses MSScriptControl TLB MS Script Control var obj IScriptControl begin obj
  • 处理嵌入式系统中的堆栈溢出

    在嵌入式软件中 如何以通用方式处理堆栈溢出 我遇到过一些确实以硬件方式提供保护的处理器 例如最近的 AMD 处理器 维基百科上有一些技术 但这些是真正实用的方法吗 任何人都可以给出一个在当今 32 位嵌入式处理器的所有情况下都适用的明确建议
  • CRC 16 -DECT 与聚 x^16 + x^10 + x^8 + x^7 + x^3 + 1

    相信我 我已经尝试过编写这个代码 尝试过谷歌 但没有任何运气 我正在尝试使用这个 Poly 实现 CRC16 x 16 x 10 x 8 x 7 x 3 1 使用C语言 因为我对 PHP 有了更好的了解 所以我试图让一个函数运行 但我没有得
  • 有没有好的 LINQ 方法来计算笛卡尔积?

    我有一个像这样的类结构 Person Dogs dog 1 dog 2 etc Puppies puppy A puppy B etc 有一个人 他有 1 n 只狗 每只狗有 1 n 只小狗 我想要一份所有可能的小狗组合的列表 从每只狗中取
  • LLVM到底是什么?

    我一直听说 LLVM 它是 Perl 语言 然后是 Haskell 语言 然后有人用其他语言使用它 它是什么 它与 GCC 到底有什么区别 视角 安全等 LLVM 是一个用于构建 优化和生成中间和 或二进制机器代码的库 LLVM 可以用作编
  • 找不到 Android 支持库和媒体路由器 .jar 文件

    我对 Xamarin 完全陌生 我想将地图添加到 Xamarin Android 中的默认 hello world 我已经按照指南一步步准备了清单 还通过 sdk 管理器下载了支持库 但出现错误 要求我安装 SL 和 SL 媒体路由器 这里
  • AVCaptureMetadataOutput().rectOfInterest 不工作

    我正在构建一个UIView它有一个覆盖的盒子 最终目标是让 QR 码阅读器仅在 QR 落入盒子内时触发 我知道我需要设置 rectOfInterest 与黄色框相同 但在当前实现 下面的代码 中 阅读器不起作用 public overrid
  • Dotfuscator Pro无法读取Jenkins构建服务器下的许可信息

    我试图让 Dotfuscator Pro 4 13 在单元测试和创建安装包之间运行 我们使用的构建服务器是 Windows Server 2008 R2 上的 Jenkins 1 487 dotfuscator 的命令行非常简单 我使用 q
  • URL 重写查询数据库?

    我试图了解 URL 重写的工作原理 我有以下链接 mysite com profile php id 23 我想用用户的名字和姓氏重写上面的网址 mysite com directory liam gallagher 然而 根据我读到的内容
  • 扩展《斯巴达克斯》中的产品模型

    我正在尝试使用我在 items xml 中创建的新属性来扩展产品模型 但我似乎无法在 Spartacus 前面获取它 我添加了一个带有以下代码的product model ts文件 import Product as CxProduct f
  • Nativescript ios 中闪屏后显示白屏

    在 Nativescript ios 中 启动屏幕后几秒钟显示白屏 这种情况仅发生在我们的项目中 但示例项目运行良好 我检查了模拟器和 iPhone 5 iPhone 6 iPad mini 所有设备都显示白屏 我将 Nativescrip
  • 如何按会计季度分组的日期计算平均值

    我有下表 Date Country Class Value 6 1 2010 USA A 45 6 1 2010 Canada A 23 6 1 2010 Brazil B 65 9 1 2010 USA B 47 9 1 2010 Can
  • 从只读 couchdb 复制

    我有一台服务器 其中包含一个 couchdb 数据库 其中包含我的应用程序所需的信息 它包含几兆字节的内容 一些每天都会变化的文档 添加最新新闻 删除旧文档 更新一些文档 应用程序会尽可能与服务器数据库同步 以便离线使用此信息 然而 这些信
  • 根据选项元素中的文本进行选项选择

    我试图在下拉列表中选择将文本值传递到函数中的选项 获取其值 然后选择具有该值的选项 你能明白为什么这不起作用吗 function selectAndAddToCart value console log The selectAndAddTo
  • 颤动导航到新屏幕不起作用

    我正在构建一个登录屏幕 将数据传递到主屏幕 当我单击登录按钮时 什么也没有发生 没有错误 但也没有发送到新屏幕 这是按钮代码 Widget submitButton return Container margin EdgeInsets al
  • 如何在 Dockerfile 中添加除隐藏目录(如 .git)之外的所有文件/目录

    我们经常做的一件事就是将所有源代码打包在Dockerfile当我们构建 Docker 镜像时 ADD app 我们怎样才能避免包括 git目录以简单的方式 我尝试使用 Unix 方式来处理这个问题ADD app 完整样本 docker bo
  • Java中引用传递的疑惑

    所以我在读这个帖子 https stackoverflow com questions 40480 is java pass by reference和回复编号 2 在该示例中 调用该方法后 地址 42 name 处的 Dog 值是否更改为
  • Spring Hibernate:重新加载实体映射

    在 Web 应用程序中 我们使用 Spring 3 2 和 Hibernate 4 1 1 并实现类似插件的架构 可以在运行时添加和删除插件 对于每个模块 我们定义了一个单独的类加载器 并在 spring 上创建单独的子应用程序上下文 完整