如何复制具有所有属性和集合的实体

时间:2015-05-14 10:31:36

标签: jspresso

标准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属性相同。 我理解“复制”的含义,它是所有属性的严格副本,因此,从后端开始,

如何复制实体以创建新实体?

1 个答案:

答案 0 :(得分:1)

CloneComponentCollectionActionCloneComponentAction都使用实施IEntityCloneFactory的可配置策略执行实际的组件和实体克隆。 Jspresso提供了这个接口的3个实现:

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

根据经验,您可以期望SmartEntityCloneFactory执行您对引用的期望,但忽略依赖集合以避免过于深入的递归克隆;所以你经历的是每个设计。如果您觉得还有改进的余地,请随时在Jspresso GitHub上打开功能请求。考虑到这一点,我们可能会对依赖于构图的集合做得更好。

当您想要处理比SmartEntityCloneFactory(或HibernateSmartEntityCloneFactory)提供的更深层次的克隆时,要做的就是创建自己的克隆策略。当然,您可以通过调用超级实现来覆盖cloneEntity方法并继承默认策略并完成克隆,并专门处理您要克隆的集合。

一旦实施了您的策略,只需在应用程序中全局注入它,方法是替换默认策略,即:

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

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

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

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

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

CarbonEntityCloneFactory.carbonCopyComponent(IComponent, IComponent, IEntityFactory)

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