首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用实体的所有属性和集合复制实体

如何使用实体的所有属性和集合复制实体
EN

Stack Overflow用户
提问于 2015-05-14 10:31:35
回答 1查看 86关注 0票数 0

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

如何使用其所有集合深深复制一个实体?

第二个相关问题:为了实现藏书的复制,我试着自己写一个动作。下面是我所写的行动的一部分:

代码语言:javascript
运行
复制
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,这并不令人满意,因为如果我向模型添加了新属性或集合,则必须手动更新该方法。

有没有一种更聪明、更灵活的方法?

嗨,文森特,关于你的回答和你最近的建议,我用下面的一个改变了我的后端:

代码语言:javascript
运行
复制
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属性相同。我理解“副本”的意思,它是所有属性的严格拷贝,所以,从后端来说,

如何复制一个实体以创建一个新的实体?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-17 16:03:30

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

  • 处理标量克隆属性但忽略所有关系的CarbonEntityCloneFactory。它几乎从未被应用程序代码直接使用过。
  • SmartEntityCloneFactory继承了CarbonEntityCloneFactory,并以以下方式处理关系:
    • 如果引用是组合的,则克隆它们,或者将相同的引用分配给克隆。
    • 将克隆的组件添加到与原始所属的集合相同的集合中。

  • HibernateAwareSmartEntityCloneFactorySmartEntityCloneFactory继承并处理延迟初始化的属性。这是默认情况下使用Hibernate后端的实现。

经验法则是,您可以期望SmartEntityCloneFactory执行您对引用的期望,但忽略依赖的集合,以避免过于深入的递归克隆;因此,您所经历的是每种设计。如果您觉得有改进的空间,可以在Jspresso GitHub上自由地打开一个特性请求。考虑到这一点,我们也许可以更好地处理与组合相关的集合。

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

一旦您的策略实现,只需通过替换默认的策略将其全局注入应用程序中,即:

代码语言:javascript
运行
复制
bean('smartEntityCloneFactory', class: 'your.CustomEntityCloneFactory',
     parent: 'smartEntityCloneFactoryBase')

或者,通过将自定义策略注入到应用程序的某个克隆操作中,例如:

代码语言:javascript
运行
复制
bean('myCustomEntityCloneFactory', class: 'your.CustomEntityCloneFactory',
     parent: 'smartEntityCloneFactoryBase')

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

关于第二个相关问题,如果您在实体克隆工厂实现(或访问其实例)内,并且希望使用策略克隆实体或组件,只需调用cloneComponentcloneEntity方法即可。

如果您只想复制克隆上的实体或组件的所有标量属性,并且无法访问克隆工厂,则可以使用以下静态实用程序方法:

代码语言:javascript
运行
复制
CarbonEntityCloneFactory.carbonCopyComponent(IComponent, IComponent, IEntityFactory)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30235083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档