是否可以在运行时创建hibernate Entity类(带注释)?它应该与在运行时添加的表相关.重要的是,Hibernate应该可以看到实体.一般来说,你能否就这个问题给我任何建议?我明白,反射是关键字,但寻找更多的单词.问候.
基本上我们有一个 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”属性设置为“更新”,以便将创建架构(我知道在生产环境中这样做是有风险的)