标准的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属性相同。我理解“副本”的意思,它是所有属性的严格拷贝,所以,从后端来说,
如何复制一个实体以创建一个新的实体?
发布于 2015-05-17 16:03:30
CloneComponentCollectionAction和CloneComponentAction都使用实现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']
)关于第二个相关问题,如果您在实体克隆工厂实现(或访问其实例)内,并且希望使用策略克隆实体或组件,只需调用cloneComponent或cloneEntity方法即可。
如果您只想复制克隆上的实体或组件的所有标量属性,并且无法访问克隆工厂,则可以使用以下静态实用程序方法:
CarbonEntityCloneFactory.carbonCopyComponent(IComponent, IComponent, IEntityFactory)使用上述方法将解决您的实现健壮性。
https://stackoverflow.com/questions/30235083
复制相似问题