Java Hibernate ORM与GraalVM本机映像编译兼容吗?
根据文档,GraalVM项目中的本机映像编译器在动态代理方面存在一些限制。由于Hibernate广泛使用代理,它能在提前编译的项目中正常工作吗 这个项目似乎表明它可以,但我的理解主要是基于一句谚语 Hibernate ORM现在甚至可以在编译为GraalVM本机映像时工作-只需确保使用Quarkus构建应用程序 如果我不想(或不能)使用Quarkus怎么办?是否可以使用使用Hibernate的GraalVM(和SubstrateVM)编译本机映像应用程序 Quarkus实际上是如何启用/支持Hibernate的?(免责声明:我是通过创建Quarkus扩展使Hibernate ORM在GraalVM本机映像上工作的人之一。我还领导Hibernate研发团队。) 谢谢你给我这个机会写一点历史:) 最初我们没有使用Quarkus,因为它还不存在 我最初的原型只是修补Hibernate ORM,堆积了许多编译器开关,以传递给本机映像工具,用bash脚本进行硬编码,直到我的演示应用程序开始工作 这种方法的问题在于,许多这样的标志实际上依赖于Hibernate ORM的内部知识、域模型的细节、配置细节,甚至更多 我开始记录这些事情,但它变得复杂和毛茸茸的;不仅不同方面相互依赖;此外,我的演示应用程序相当简单,而实际应用程序的情况必然会变得更加复杂。。。我认为我们不可能写出一份既通俗又“易懂”的好文件 对于终端用户来说,让事情简单化的另一种选择是“在您可能使用的所有这些类上启用反射”,但我有点喜欢优化,这会创建更大、更臃肿的二进制文件,而不是只包含应用程序真正需要的所有内容 因此,我们的团队决定编写一个工具来自动处理这些细节。。它成为了一种构建工具,可以分析应用程序,找出最佳的交换机。我们没有只关注Hibernate ORM,而是创建了“扩展”的概念,它也知道如何在其他库中使用相同的技巧,这样您就可以从更复杂的应用程序中获得高度优化的二进制文件,这些应用程序使用的是受支持的库的组合,而不仅仅是Hibernate 显然,这是必要的,因为不同的库可能有冲突的需求,并且每个其他库的编译器标志和最终用户代码的组合需要组合在一组一致的兼容标志中 这就是Quarkus如何成为一种东西:) 要了解其工作原理的详细信息,我建议阅读指南和源代码:Java Hibernate ORM与GraalVM本机映像编译兼容吗?,java,hibernate,quarkus,graalvm,Java,Hibernate,Quarkus,Graalvm,根据文档,GraalVM项目中的本机映像编译器在动态代理方面存在一些限制。由于Hibernate广泛使用代理,它能在提前编译的项目中正常工作吗 这个项目似乎表明它可以,但我的理解主要是基于一句谚语 Hibernate ORM现在甚至可以在编译为GraalVM本机映像时工作-只需确保使用Quarkus构建应用程序 如果我不想(或不能)使用Quarkus怎么办?是否可以使用使用Hibernate的GraalVM(和SubstrateVM)编译本机映像应用程序 Quarkus实际上是如何启用/支持Hi
- 在编译时解析所有注释查找和实体解析
- 准备一些带有“静态”初始化字段的实例。准备好的实例存储在映像中,并准备在启动时仅在堆上分配
- 如果需要,在编译时生成“代理”
- 基本上Quarkus(作为gralvm的“插件”)会“在应用程序实际连接到数据库时启动应用程序”。然后它获取内存快照并将其嵌入到jar/native文件中
- Quarkus也接触了一些其他库,它们做“禁止”的事情(封闭世界假设)
PS:这里有Quarkus的小介绍:从Quarku浏览