例外が処理されたときの保存は動作しません。

ジョンMenighin:

私は、私もデバッグへの道を見つけることができない状況に直面しています。

私は、次の持っているspring-dataリポジトリを:

IntegrationLogRepository

public interface IntegrationLogRepository extends PagingAndSortingRepository<IntegrationLog, Long> {

}

FooRepository

public interface FooRepository extends PagingAndSortingRepository<Foo, Long> {

}

そして、私のビジネスロジックに私は次のようなものがあります:

IntegrationLog log = new IntegrationLog();
log.setTimestamp(new Date());

try {
    Foo foo = new Foo();

    // Build the Foo object...

    fooRepository.save(foo);
    log.setStatus("OK");
} catch (Exception e) {
    log.setStatus("NOK");
} finally {
    integrationLogRepository.save(log);
}

統合は罰金を実行すると、log一緒に保存されているOK状態。すべて順調。私は例外を持っている場合でも、何らかの理由でintegrationLogRepository.save(log)何もしないことはありません。I平均何もNOTHING:例外がスローされないと、私は任意の休止クエリは、私のWebLogicコンソール上で実行されて見ることができません。ログは保持されません...

なぜこれが起こっている上の任意のアイデア?

以下の私の依存関係は、以下のとおりです。

compile 'org.springframework.boot:spring-boot-starter-data-rest'
compile 'org.springframework.boot:spring-boot-starter-security'
compile "org.springframework.boot:spring-boot-starter-web-services"
runtime 'org.springframework.boot:spring-boot-devtools'
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
compile "org.springframework.boot:spring-boot-starter-websocket"
compile 'javax.servlet:javax.servlet-api:3.1.0'
compile 'org.hibernate:hibernate-core:5.1.16.Final'
compile 'org.hibernate:hibernate-validator:5.2.3.Final'
compile 'org.hibernate:hibernate-entitymanager:5.1.0.Final'

春ブーツ上で実行されている1.5.15.RELEASE、ジャワ1.7およびWebLogic 12.1.3

ありがとう!

Rentius2407;

スローされた例外は、統合ログを保存するロールバックされます。あなたは、ログを保存したい場合は、保存時にそれを別のトランザクションを与える必要があります。

サービスへのログは新しいトランザクションを作成し、トランザクションを追加し保存し、サービスメソッドの抽象ログ・リポジトリ。

@Service
public class IntegrationLogService {

    private final IntegrationLogRepository logRepository;

    @Autowired
    public IntegrationLogService(IntegrationLogRepository logRepository) {
        this.logRepository = logRepository;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(Log log) {
        this.logRepository.save(log);
    }
}

あなたのビジネスに置き換えます

finally {
    integrationLogRepository.save(log);
}

とともに

finally {
    integrationLogService.save(log);
}

編集します

設定はなぜ@Transactional(propagation = Propagation.NOT_SUPPORTED)ビジネス層の上には、働いていましたか?

それが働いた理由を理解するために、我々は1つが呼び出したときに何が起こるかを初めて目に必要saveな使用することを春にリポジトリにorg.springframework.data.repository.CrudRepository

春は決定しようとするTransactionAttribute方法とtargetClass上のを。この方法の場合saveとクラスCrudRepository、要するにそれは、いずれかを見つけることができませんでした。春の用途SimpleJpaRepositoryのデフォルトの実装としてはCrudRepository、それはあなたにすべてのトランザクション属性が見つからなかった場合、それはで指定されたものを使用しますSimpleJpaRepository

@Transactional
public <S extends T> S save(S entity)

上のデフォルトの伝播が@Transactional必要です。

Propagation propagation() default Propagation.REQUIRED;

が存在しない場合、現在のトランザクションをサポートし、新しいものを作成します。

あなたは上記のドキュメントから見ることができるように、何のトランザクションが指定されていない場合には、新しいものを作成します。あなたは営業層の上にトランザクションを設定するときにNOT_SUPPORTED(非トランザクションの実行)、実際には、CrudRepositoryロールバックがそれに影響を与えないこと、それ自身のトランザクションを作成しました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=219993&siteId=1