Ram*_*iha 5 hibernate jpa hibernate-mapping spring-data spring-data-jpa
基本上我们有一个 spring boot 应用程序,它要求用户可以定义他/她自己的一组字段,并且这些字段应该在运行时通过 JPA/Hibernate 保存在他们自己的类/表中。这些类将通过 bytebuddy 动态生成。
所有这些都应该动态完成,而不必重新启动应用程序。Hibernate 动态映射不是一个选项,因为我们将完全创建新类并重新映射它们。
我还考虑了 EAV 模型,但它不起作用,因为我们需要为每组数据使用单独的表,因此 JSON 不能混合在同一个表中。
我正在考虑的第一个解决方案是代理 EntityManagetFactory,当我们有一个新实体要映射时,我将重新创建 EntityManagetFactory 并将新映射的实体添加到它,我还将设置 hbm2ddl.auto “更新”以确保创建新表方案。
问题是我不知道哪些其他类可能需要代理,我相信我必须代理 Hibernate SessionFactory,但我不确定需要重新创建和代理多少其他类,我相信这是一条复杂的道路。
另一种解决方案是通过使用 Hibernate OGM 在 SQL 和 NoSQL 解决方案之间进行混合,但在这种情况下,我将失去与现有 SQL 实体之间的任何关系,并且我不赞成运行第二个 NoSQL DB。
我可以探索其他任何解决方案吗?
编辑:
我会使用 bytebuddy 来动态生成新类,并且它们会有 @Entity 注释,生成的类被写入临时 jar 文件(例如 /tmp/myjar.jar )
使用 BeanPostProcessor.postProcessAfterInitialization 我将用代理类替换 LocalContainerEntityManagerFactoryBean。
我还使用 LocalContainerEntityManagerFactoryBean .setPersistenceUnitPostProcessors 添加了一个额外的处理器来处理新创建的 jar 中的类
因此,现在在使用 bytebuddy 创建新类后,我将手动调用 LocalContainerEntityManagerFactoryBeanProxy.afterProperties 来完成引导 JPA 和休眠层的所有工作,我还将“hibernate.hbm2ddl.auto”属性设置为“更新”,以便将创建架构(我知道在生产环境中这样做是有风险的)
Hibernate 将实体映射到表,元数据是在引导期间构建的。因此,您无法在应用程序运行时即时修改它。
不过,只要不断添加新表而不修改现有结构,就可以在架构层面解决这个问题:
或者,只需使用 NoSQL 数据库(例如 MongoDB 和 Hibernate OGM),因为您的需求无论如何都不太适合关系数据库。
但是,如果您已经使用 RDBMS,那么使用 JSON 会更简单,而不是因此而切换到 NoSQL 数据库。
| 归档时间: |
|
| 查看次数: |
6711 次 |
| 最近记录: |