私は、私もデバッグへの道を見つけることができない状況に直面しています。
私は、次の持っている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
。
ありがとう!
スローされた例外は、統合ログを保存するロールバックされます。あなたは、ログを保存したい場合は、保存時にそれを別のトランザクションを与える必要があります。
サービスへのログは新しいトランザクションを作成し、トランザクションを追加し保存し、サービスメソッドの抽象ログ・リポジトリ。
@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
ロールバックがそれに影響を与えないこと、それ自身のトランザクションを作成しました。