gpt4 book ai didi

hibernate - JPA Hibernate 运行时动态实体映射和持久化

转载 作者:行者123 更新时间:2023-12-03 06:56:02 31 4
gpt4 key购买 nike

基本上,我们有一个 Spring Boot 应用程序,它要求用户可以定义他/她自己的一组字段,并且这些字段应在运行时通过 JPA/Hibernate 持久保存在自己的类/表中。这些类将通过bytebuddy动态生成。

所有这些都应该动态完成,而无需重新启动应用程序。Hibernate 动态映射不是一个选项,因为我们将完全创建新类并重新映射它们。

我也考虑过 EAV 模型,但这行不通,因为我们需要为每组数据提供单独的表,因此 JSON 不能混合在同一个表中。

我正在考虑的第一个解决方案是代理EntityManagetFactory,当我们有一个新的实体要映射时,我将重新创建EntityManagetFactory并向其中添加新的映射实体,我还将拥有hbm2ddl .auto 设置为“更新”以确保创建新表方案。

问题是我不知道还有哪些其他类可能需要代理,我相信我必须代理 Hibernate SessionFactory,但我不确定还有多少其他类需要重新创建和代理我相信这是一条复杂的道路。

另一个解决方案是使用 Hibernate OGM 混合 SQL 和 NoSQL 解决方案,但在这种情况下,我将失去与现有 SQL 实体之间的任何关系,并且我不赞成运行第二个NoSQL 数据库。

还有其他我可以探索的解决方案吗?

编辑:

我将使用 bytebuddy 来动态生成新类,它们将具有 @Entity 注释,生成的类将写入临时 jar 文件(例如/tmp/myjar.jar )

使用 BeanPostProcessor.postProcessAfterInitialization,我将用代理类替换 LocalContainerEntityManagerFactoryBean。

我还使用 LocalContainerEntityManagerFactoryBean .setPersistenceUnitPostProcessors 添加一个额外的处理器来处理新创建的 jar 中的类

现在,在使用 bytebuddy 创建新类后,我将手动调用 LocalContainerEntityManagerFactoryBeanProxy.afterProperties 来完成引导 JPA 和 hibernate 层的所有工作,我还将“hibernate.hbm2ddl.auto”属性设置为“update”这样就可以创建模式(我知道在生产环境中这样做是有风险的)

最佳答案

Hibernate 将实体映射到表,元数据是在引导期间构建的。因此,您无法在应用程序运行时即时修改它。

但是,只要不断添加新表而不修改现有结构,就可以在架构层面解决这个问题:

  1. 您可以根据需要进行类更改。
  2. 您构建项目工件。
  3. 您将新项目工件部署到新服务器。
  4. 您可以通过负载均衡器将流量从旧服务器实例切换到新服务器实例,而无需任何停机。

或者,只需将 MongoDB 等 NoSQL 数据库与 Hibernate OGM 结合使用,因为您的需求无论如何都不太适合关系数据库。

但是,如果您已经使用 RDBMS,那么 it's simpler to just use JSON而不是仅仅因为这个原因而切换到 NoSQL 数据库。

关于hibernate - JPA Hibernate 运行时动态实体映射和持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47330810/

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