2017-03-20 8 views
0

を更新しない更新の春JpaRepositoryは、私は次のJPARepoコードを持つテーブル

@Service 
@Slf4j 
@Transactional(readOnly = true) 
public class MyService { 
@Autowired 
    private MyObjectRepository myObjectRepository; 

    // some methods here 

    @Transactional 
    public void deleteMyObject(MyObject myObject) { 
    ** first way ** 
    myRepository.deleteById(myObject.getMyObjectId()); 
    ** second way ** 
    myObject.setDeleted(true); 
    myObjectRepository.save(myObject); 
    } 

    //some methods here 

} 

二つの方法は、一度だけ実行されます。次回メソッドを呼び出すとき、deleteカラムのentityの値はデフォルトではfalseで、更新後はfalseのままです。しかし、デバッグ時に私はステップごとにテーブルを見て、私は削除された列がtrueに設定され、私がデバッグをリリースすると、削除フラグが再びfalseに設定されて参照してください。 注釈がキャッシュされているか正しくないですか?

+0

例外がスローされ、ロールバックが発生する可能性があります。 –

+0

@RC。いいえ、すべてがクリアです –

+1

更新クエリの実行は、オブジェクトモデルに直接反映されていません。特定の更新クエリの実行後、データベースから強制的にオブジェクトを再読み込みする必要があります。 (休止状態の場合は、スコープ外のオブジェクト状態を変更しています)。したがって、あなたのアプリケーションの場合は 'false'の場合に限ります。別のものを更新したり、クエリをトリガしたりすると、メモリ内とdbの状態が異なるため、状態はリセットされます。あなたのコメントに@ D.Deinumありがとうございました。 –

答えて

1

私はクラスレベルの@Transactional(readOnly = true)がすべてのメソッドに当てはまると思いますが、メソッドレベルで@Transactional(readOnly = false)に変更できますか?

@Transactional(readOnly = false) 
    public void deleteMyObject(MyObject myObject) { 
+0

実際には 'MyService'に書かれています - メソッドは' Transactional'です(デフォルトではfalseです)。クラスレベルで 'readonly = false'として設定しようとしましたが、結果はありません –

+0

メソッドレベル...とにかくあなたがクラスレベルに入れたときに動作するはずです –

+0

メソッドとクラスの両方を試しました - 結果はありません –

関連する問題