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
相关产品推荐
相关产品推荐

