在我们的项目中,我们正在克隆表数据"和"后续表"在层次结构中。为此,在域对象中,我们正在编写一个" clone()"方法,创建类的对象,然后在创建的对象中设置属性。我们在代码中做的是这样的(这是"虚拟Book.groovy类的克隆对象"表示数据库中的书表)
public Book clone(def newParent) {
def clonedBook = new Book(properties)
clonedBook.parent=newParent
clonedBook.<childObject>=<childObject>*.clone(clonedBook)
return clonedBook
}
&#34; clone()&#34; Book的方法是从父表的域类的克隆方法调用的,它依次调用&#34; clone()&#34;子域类的方法。在数据库中,外键被设为ON DELETE NO ACTION
因此,在以这种方式运行时,我遇到了完整性约束违规异常,它通过将&#34; ON DELETE NO ACTION更改为ON DELETE CASCADE&#34;来解决。然后我开始得到&#34; HibernateOptimisticLockingFailure异常&#34;。这也是通过不通过&#39;属性来解决的。在&#34; clonedBook&#34;的构造函数中,但在&#34; clonedBook&#34;中明确设置Book.groovy的属性。例如,&#34; clone()&#34;方法是
public Book clone(def newParent) {
def clonedBook = new Book() //properties not passed here
clonedBook.name = name //explicitly set
clonedBook.price = price //explicitly set
...
}
但我无法找到问题以这种方式解决的原因,或者前一种方式出了什么问题。我正在使用&#34; Grails 2.4.4&#34;和MySQL数据库