0

标准 Jspresso 操作cloneEntityCollectionFrontAction允许复制表格中的选定行。复制仅限于当前模型,如果存在则不考虑集合(即:集合不会自动复制)

如何深度复制一个实体及其所有集合?

第二个相关问题:我试图自己写一个动作以实现集合的复制。下面是我写的部分动作:

Offer newOffer = bc.getEntityFactory().createEntityInstance(Offer.class);
Offer clonedNewOffer = bc.cloneInUnitOfWork(newOffer);

clonedNewOffer.setCustomer(curOf.getCustomer());
clonedNewOffer.setEndApplicationDate(curOf.getEndApplicationDate());
clonedNewOffer.setName(curOf.getName());
clonedNewOffer.setStartApplicationDate(curOf.getStartApplicationDate());

我为每个不令人满意的属性调用了 getter 和 setter,因为如果我向模型添加新属性或集合,则必须手动更新该方法。

有没有办法编写更智能/灵活的方法?

嗨,文森特,关于您所做的回答和您的最新建议,我将后端更改为以下内容:

Offer newOffer = bc.getEntityFactory().createEntityInstance(Offer.class);
Offer clonedNewOffer = bc.cloneInUnitOfWork(newOffer);

CarbonEntityCloneFactory.carbonCopyComponent(curOf, clonedNewOffer, bc.getEntityFactory());

bc.registerForUpdate(clonedNewOffer);

但是registerForUpdate由于Data constraints are not satisfied错误而失败。

我检查了 clonedNewOffer 的 Id 属性,并且 Id 已经与 curOf Id 属性相同。我理解“副本”的含义,它是所有属性的严格副本,因此,从后端,

我怎样才能复制一个实体以创建一个新实体?

4

1 回答 1

1

两者都使用实现的可配置策略执行实际的组件和实体CloneComponentCollectionAction克隆。Jspresso 提供了这个接口的 3 种实现:CloneComponentActionIEntityCloneFactory

  • CarbonEntityCloneFactory处理标量可克隆属性但忽略所有关系。应用程序代码几乎从不直接使用它。
  • SmartEntityCloneFactory通过以下方式继承CarbonEntityCloneFactory并处理关系:
    • 如果引用是合成的,则克隆引用,或者将相同的引用分配给克隆。
    • 将克隆的组件添加到与原始组件相同的集合中。
  • HibernateAwareSmartEntityCloneFactory继承SmartEntityCloneFactory并处理惰性初始化属性。如果您使用 Hibernate 后端,这是默认使用的实现。

根据经验,您可以期望SmartEntityCloneFactory执行您对引用的期望,但忽略依赖集合以避免太深的递归克隆;所以你所经历的是每个设计。如果您觉得还有改进的余地,请随时在Jspresso GitHub 上提出功能请求。想一想,我们也许可以在组合依赖集合方面做得更好。

当您想要处理比SmartEntityCloneFactory(or HibernateSmartEntityCloneFactory) 提供的更深的克隆时,您可以创建自己的克隆策略。当然你也可以继承默认策略,cloneEntity通过调用super实现重写方法完成克隆,具体处理你要克隆的集合。

实施策略后,只需通过替换默认策略将其全局注入应用程序,即:

bean('smartEntityCloneFactory', class: 'your.CustomEntityCloneFactory',
     parent: 'smartEntityCloneFactoryBase')

或者特别是通过在操作上注入您的自定义策略来针对您的应用程序的克隆操作之一,例如:

bean('myCustomEntityCloneFactory', class: 'your.CustomEntityCloneFactory',
     parent: 'smartEntityCloneFactoryBase')

action('customCloneAction', parent: 'cloneEntityCollectionFrontAction',
       custom:[entityCloneFactory_ref: 'myCustomEntityCloneFactory']
)

关于您的第二个相关问题,如果您在实体克隆工厂实现中(或有权访问它的实例)并且想要使用该策略克隆实体或组件,只需调用cloneComponentorcloneEntity方法。
如果您只想在克隆上复制实体或组件的所有标量属性并且无权访问克隆工厂,则可以使用以下静态实用程序方法:

CarbonEntityCloneFactory.carbonCopyComponent(IComponent, IComponent, IEntityFactory)

使用上述方法将解决您的实现健壮性。

于 2015-05-17T16:03:30.557 回答