0

標準の Jspresso アクションcloneEntityCollectionFrontActionを使用すると、テーブルで選択した行を複製できます。複製は現在のモデルに限定され、コレクションが存在する場合は考慮されません (つまり、コレクションは自動的に複製されません)。

すべてのコレクションでエンティティを深く複製する方法は?

2番目の関連質問: コレクションの複製を実現するためのアクションを自分で書いてみました。私が書いたアクションの一部の下:

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());

モデルに新しいプロパティまたはコレクションを追加すると、メソッドを手動で更新する必要があるため、各プロパティに対してゲッターとセッターを呼び出しましたが、満足のいくものではありませんでした。

よりスマートで柔軟なメソッドを書く方法はありますか?

こんにちはヴィンセント、あなたの答えとあなたの最新の提案に関して、私はバックエンドを次のものに変更しました:

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およびCloneComponentActionを実装する構成可能な戦略を使用して、実際のコンポーネントとエンティティのクローン作成を実行しますIEntityCloneFactory。Jspresso は、このインターフェースの 3 つの実装を提供します。

  • CarbonEntityCloneFactoryスカラーの複製可能なプロパティを扱いますが、すべての関係を無視します。アプリケーション コードで直接使用されることはほとんどありません。
  • SmartEntityCloneFactoryから継承しCarbonEntityCloneFactory、次の方法でリレーションシップを処理します。
    • 構成の場合は参照を複製するか、同じ参照を複製に割り当てます。
    • 元のコンポーネントが属するのと同じコレクションに複製されたコンポーネントを追加します。
  • HibernateAwareSmartEntityCloneFactorySmartEntityCloneFactory遅延初期化プロパティから継承して処理します。これは、Hibernate バックエンドを使用する場合にデフォルトで使用される実装です。

経験則として、 がSmartEntityCloneFactory参照に関して期待することを実行することを期待できますが、深すぎる再帰的複製を避けるために依存コレクションを無視します。あなたが経験したことはデザインごとです。改善の余地があると思われる場合は、Jspresso GitHubでお気軽に機能リクエストを送信してください。考えてみると、構成に依存するコレクションについてもっとうまくやれるかもしれません。

SmartEntityCloneFactory(または)によって提供されるものよりも深いクローン作成に対処したい場合はHibernateSmartEntityCloneFactory、独自のクローン作成戦略を作成することをお勧めします。もちろん、デフォルトの戦略を継承しcloneEntity、スーパー実装を呼び出してメソッドをオーバーライドすることでクローン作成を完了し、クローンしたいコレクションを具体的に扱うことができます。

戦略が実装されたら、デフォルトのものを置き換えることにより、アプリケーションにグローバルに注入するだけです。

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

または具体的には、アクションにカスタム戦略を注入することにより、アプリケーションのクローン アクションの 1 つに次のように指定します。

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

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

2 番目の関連する質問については、エンティティ クローン ファクトリの実装内にいる場合 (またはそのインスタンスにアクセスできる場合) で、戦略を使用してエンティティまたはコンポーネントをクローンしたい場合は、cloneComponentorcloneEntityメソッドを呼び出すだけです。
エンティティまたはコンポーネントのすべてのスカラー プロパティをクローンにコピーするだけで、クローン ファクトリにアクセスできない場合は、次の静的ユーティリティ メソッドを使用できます。

CarbonEntityCloneFactory.carbonCopyComponent(IComponent, IComponent, IEntityFactory)

上記の方法を使用すると、実装の堅牢性が解決されます。

于 2015-05-17T16:03:30.557 に答える