You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataNucleus 6增强器clone方法引发无限循环问题求助

DataNucleus 6增强器clone方法无限循环问题及兼容V5的配置方案

场景与问题说明

使用DataNucleus 6实现Java类持久化时,存在一个继承自可持久化父类的子类,该子类重写了clone方法。增强器会为父类和子类分别生成dnClone方法,以及调用dnClone的新clone方法,最终引发无限循环:

  • 子类增强后的dnClone方法会调用super.clone()
  • 父类的clone方法会调用this.dnClone(),而this指向子类实例,因此又回到子类的dnClone,形成循环

父类增强后代码

public Object clone() throws CloneNotSupportedException {
    MySuperClass copy = (MySuperClass)this.dnClone();
    copy.dnFlags = 0;
    copy.dnStateManager = null;
    return copy;
}

public Object dnClone() throws CloneNotSupportedException {
    MySuperClass dc = new MySuperClass(this.id);
    ....
    return dc;
}

子类未增强的clone方法

public Object clone() throws CloneNotSupportedException {
    Object oCloned = super.clone();
    ExtClass edc = new ExtClass((MySuperClass)oCloned);
    edc.setFinishedBy(finishedBy);
    return edc;
}

子类增强后代码

public Object clone() throws CloneNotSupportedException {
    ExtClass copy = (ExtClass)this.dnClone();
    copy.dnFlags = 0;
    copy.dnStateManager = null;
    return copy;
}

public Object dnClone() throws CloneNotSupportedException {
    Object oCloned = super.clone();
    ExtClass edc = new ExtClass((MySuperClass)oCloned);
    edc.setFinishedBy(this.finishedBy);
    return edc;
}

解决方案

可以通过配置增强器的clone-behaviour参数为v5-compatible,恢复DataNucleus 5的行为——仅生成单个clone方法,不拆分出dnClone,从而避免循环问题。

配置方式

  • Maven插件配置:在DataNucleus增强插件的配置中添加属性:
<configuration>
    <enhancerProperties>
        <property>
            <name>clone-behaviour</name>
            <value>v5-compatible</value>
        </property>
    </enhancerProperties>
</configuration>
  • 命令行增强器:添加JVM参数:
-Dclone-behaviour=v5-compatible

该配置会让增强器直接修改原clone方法的实现,不再生成dnClone,保持与DataNucleus 5一致的逻辑,彻底解决无限循环问题。

内容的提问来源于stack exchange,提问作者user2199467

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:07:16