現在のプロジェクトには、他のシステムに公開できるエンティティがあります。出版物を追跡するために、エンティティには「出版物」と呼ばれる関係があります。Eclipselinkを使用しています。
このエンティティBeanには、「PreUpdate」注釈付きメソッドもあります。
他のシステムデータを最新の状態に保つことができるようにするために、PreUpdateメソッドの呼び出しの前後で実行されるアスペクトを作成しました。変更されたプロパティに応じて、いくつかのパブリケーションを削除する必要があります。すべてが完全に正常に機能しています。
私が抱えている問題は、ポータル発行コンポーネントが削除コマンドを正しく送信し、エンティティの「パブリケーション」リストからパブリケーションを削除することです。チェンジセットでは、JPAが「publications」プロパティが変更されたことに気付いたことがわかります。トランザクションがフラッシュされた後、キャッシュされたエンティティには、削除されたパブリケーションが正しくありません。残念ながら、データベースは引き続き機能し、システムを再起動するか、エンティティがDBから再度ロードされると、パブリケーションメタデータが再び存在します。
私はほとんどすべてを試しました。アスペクトのJPAChangeSetから削除されたインスタンスを取得し、entityManagerを使用して手動で削除しようとしましたが、実際には何も機能しませんでした。これらの関係エンティティを削除できないようです。現在、JDBCを使用してそれらを削除することを考えていますが、これは私の最後の手段にすぎません。
@Transactional
@Around("execution(* de.cware.services.truck.model.Truck.jpaPreUpdate(..))")
public Object truckPreUpdate(final ProceedingJoinPoint pjp) throws Throwable {
if (alreadyExecutingMarker.get() != Boolean.TRUE) {
alreadyExecutingMarker.set(Boolean.TRUE);
final Truck truck = (Truck) pjp.getTarget();
final JpaEntityManager jpaEntityManager = (JpaEntityManager) entityManager.getDelegate();
final UnitOfWorkChangeSet changeSet = jpaEntityManager.getUnitOfWork().getCurrentChanges();
final ObjectChangeSet objectChangeSet = changeSet.getObjectChangeSetForClone(truck);
if (log.isDebugEnabled()) {
log.debug("--------------------- Truck pre update check (" + truck.getId() + ") ---------------------");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// If the truck date has changed, revoke all publication copies.
////////////////////////////////////////////////////////////////////////////////////////////////////////////
final ChangeRecord truckFreeDate = objectChangeSet.getChangesForAttributeNamed("lkwFreiDatum");
if (truckFreeDate != null) {
if (log.isDebugEnabled()) {
log.debug("The date 'truckFreeDate' of truck with id '" + truck.getId() + "' has changed. " +
"Revoking all publications that are not marked as main applications");
}
for (final String portal : truck.getPublishedPortals()) {
if (log.isDebugEnabled()) {
log.debug("- Revoking publications of copies to portal: " + portal);
}
portalService.deleteCopies(truck, portal);
// Get any deleted portal references and use the entityManager to finally delete them.
changeSet = jpaEntityManager.getUnitOfWork().getCurrentChanges();
objectChangeSet = changeSet.getObjectChangeSetForClone(truck);
final ChangeRecord publicationChanges = objectChangeSet.getChangesForAttributeNamed("publications");
if (publicationChanges != null) {
if (publicationChanges instanceof CollectionChangeRecord) {
final CollectionChangeRecord collectionChanges =
(CollectionChangeRecord) publicationChanges;
@SuppressWarnings("unchecked")
final Collection<ObjectChangeSet> removedPublications =
(Collection<ObjectChangeSet>)
collectionChanges.getRemoveObjectList().values();
for (final ObjectChangeSet removedPublication : removedPublications) {
final TruckPublication publication = (TruckPublication) ((org.eclipse.persistence.internal.sessions.ObjectChangeSet) removedPublication).getUnitOfWorkClone();
entityManager.remove(publication);
}
}
}
}
}
}
}
クリス