Hibernate 如何在ColdFusion Form中深度克隆持久实体?

Hibernate 如何在ColdFusion Form中深度克隆持久实体?,hibernate,orm,coldfusion,coldfusion-9,deep-copy,Hibernate,Orm,Coldfusion,Coldfusion 9,Deep Copy,我有一个用作模板的持久实体: Company Locations Departments Employees 换句话说,一家公司包含许多地点,其中包含许多部门,其中包含许多员工。我有一个公司设置为模板,创建新公司时应复制该模板。但是,此模板在数据库中是持久的。我尝试使用以下代码对其进行深度克隆: var template = EntityLoadByPK("Company", 13); var company = Duplicate(templ

我有一个用作模板的持久实体:

Company
    Locations
        Departments
            Employees
换句话说,一家
公司
包含许多
地点
,其中包含许多
部门
,其中包含许多
员工
。我有一个
公司
设置为模板,创建新公司时应复制该模板。但是,此模板在数据库中是持久的。我尝试使用以下代码对其进行深度克隆:

var template = EntityLoadByPK("Company", 13);
var company =  Duplicate(template);
EntitySave(company);
但是我收到一个错误,说实体没有附加到会话。因此,在保存之前,我尝试将0分配给所有ID:

company.setId(0);
for (location in company.getLocations())
{
    location.setId(0);
    // more nested for loops
}
但我收到了一个类似的错误。最后,我尝试对属性进行1:1的直接复制:

var newCompany = EntityNew("Company");
newCompany.setName(company.getName());
newCompany.setCEO(company.getCEO());
// etc...

但对象图越深入,这就变得越来越麻烦。有没有一种更简单的方法可以深度克隆持久实体,从而获得一个全新的临时实体,包括它的所有子集合?

上次遇到同样的情况时,我只是在根CFC中编写了一个类似克隆的方法。不能称之为克隆,因为我想它是保留的。

你试过使用吗?您应该能够复制ORM对象,清空ID,然后将其合并回会话。

我尝试了一下,效果非常好。需要记住的一件事是,它复制了所有内容,因此,如果您有返回到树的双向关系,那么最终将复制整个数据库。最后,我选择了Henry的解决方案,因为我希望对复制过程进行更细粒度的控制,尽管这样做的代码要多得多。