Hibernate 在运行时创建Pojo,并在将Pojo保存到磁盘后抛出一个错误作为类修剪?

Hibernate 在运行时创建Pojo,并在将Pojo保存到磁盘后抛出一个错误作为类修剪?,hibernate,class,dynamic,bytecode,Hibernate,Class,Dynamic,Bytecode,参考下面的链接,我已经在运行时创建了类,在调用cc.toClass()之前或之后使用了cc.writeFile(//path”)类存储在指定的位置。 但在cc.writeFile()之后引发如下错误无法继续 线程“main”java.lang.RuntimeException:toBytecode():EmployeeEntity中的异常已被删除。当查看时,问题似乎是由以下事实引起的:已更改和已删除,两者均为true 实际上,至少在最近的版本中,默认情况下应该关闭自动修剪。但如果类文件已被修剪,

参考下面的链接,我已经在运行时创建了类,在调用
cc.toClass()
之前或之后使用了
cc.writeFile(//path”)
类存储在指定的位置。 但在cc.writeFile()之后引发如下错误无法继续

线程“main”java.lang.RuntimeException:toBytecode():EmployeeEntity中的异常已被删除。

当查看时,问题似乎是由以下事实引起的:
已更改
已删除
,两者均
为true

实际上,至少在最近的版本中,默认情况下应该关闭自动修剪。但如果类文件已被修剪,则不应允许后续修改。这导致了这样一个结论:您不可能在这两者之间修改
CtClass
对象,因此错误不在您这边。搜索文件中出现的
wasChanged
,会发现该文件忘记将其设置为
false

那么发生了什么呢

  • 您设置了正在构造的类,它将
    wasChanged
    变为
    true
  • 您调用
    toClass()
    ,它反过来调用
    toBytecode
    ,将
    prunted
    freezed
    设置为
    true
    ,不允许进一步修改,但忘记将
    wasChanged
    设置为
    false
  • 您可以调用
    writeFile
    ,它也会调用
    toBytecode
    ,现在它会根据从不重置的标志检测文件已被修改,并在类被修剪时引发异常
如果您交换
toClass()
writeFile
,则逻辑保持不变,因为这两个函数都在内部调用
toBytecode
,鉴于上述行为,不能调用两次

你有几个选择

  • 您可以在调用
    toClass()
    之前调用,因为
    debugWriteFile
    被记录为“在编写类文件后不修剪或冻结类”

  • 您可以在调用
    writeFile
    toClass
    之前调用。如上所述,修剪在默认情况下应该是均匀的

  • 你可以直接给自己打电话,只打一次。然后

    • 一旦你有了字节数组,你就可以简单地将它写入一个文件(例如

    • 要使用这个现有的字节数组来创建类,您可以使用自己的类加载器,或者使用Java 9或更高版本,并在自己的包中创建一个类

    这可能有点复杂,但因为这样只构造一次类文件字节,所以它是最有效的解决方案