2017-05-11 7 views
0

@Asyncメソッドと@Transactionalメソッドの中で、@Serviceクラスでいくつかの永続化操作を実行しています。@Asyncと@Transactionalは、すでに永続化されている永続オブジェクトを保持します。JPA

このメソッドでは、いくつかのオブジェクトを残しておき、同じトランザクション内にすでに保持されているこれらのオブジェクトに関連する新しいオブジェクトを保持します。彼はこの関連オブジェクトを永続化されていないと考えているので

JPAが例外をスローします。

a new object was found through a relationship that was not marked cascade PERSIST 

これは私のサービスクラスの構造である:私はトランザクションと非同期メソッドに関連する何かがあると思い

@Service 
public class AsyncOperationsServiceImpl implements AsyncOperationsService { 


    @Async 
    @Override 
    @Transactional 
    public void save(CampaignDTO campaignDTO) { 
     // saving related objects here throws an exception 
    } 

} 

、なぜなら、Asyncにアノテートされていないときには、同じコードが働いているからです。

私はまた、Transactionalアノテーションで伝播を試みましたが、機能していません。

私はここで何が欠けていますか?

ありがとうございます!

答えて

0

カスケードに関連する問題があります。@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)注釈を使用してエンティティ内のリレーションを宣言する必要があります。

+0

実際、Asyncを使わずに同じコードを実行するとOkですので、カスケードは必要ありません。また、このオブジェクトはすでに保持されています。 – jpadilladev

0

解決策が見つかりました。

この伝播はこの場合に必要なので、トランザクションが伝播されます。

@Async 
@Override 
@Transactional(propagation = REQUIRES_NEW) 
public void save(CampaignDTO campaignDTO) { 
    // saving related objects here throws an exception 
} 

この場合、エンティティのカスケードタイプを変更することなく、例外はスローされません。

関連する問題