春を使って簡単な休憩アプリケーションを開発中です。(Spring)JPA/Hibernateの奇妙な振る舞い
私はSpringの@Scheduledアノテーションを使って定期的に実行するメソッドを実装しようとしています。 私は、外部APIからデータを取得し、それをdatabse(Spring Jpaリポジトリ、CrudRepositryを拡張)に格納する方法を持っていました。私が持っているエンティティは、会社とレポートです(会社には多くのレポートがあります)。
た問題イムはこれです:
私は(簡単なテスト用)コントローラからそのupdateメソッドを呼び出していましたが、今私はそれが自分自身で実行されるように、私のスケジューリングクラスからそれを呼びたい開始します。私は、コントローラからメソッドを呼び出したときに
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: Models.Company; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: Models.Company
これは実現しなかったとそれがない理由を私は知らない。私は(それを修正することなく)コードを移動し、shcedulerから呼び出され、そのときしかし、私はこの例外を取得します今。
これは、両方のケースで使用してコードイムです:
updateReportsメソッド内ReportsManager reportsManager = new ReportsManager();
reportsManager.updateReports(resultRepository, companyRepository.findAll());
私はこのような何か:
List<BasicReport> resultsList = new ArrayList<>();
反復企業のリストオーバーをし、レポートオブジェクトを作成します。
BasicReport currentResult = new BasicReport();
currentResult.setReportName(request.getReportName());
currentResult.setCompany(request.getCompany());
resultsList.add(currentResult);
次に、そのリストを他の場所に保存します。
repository.save(currentResults);
私はどちらの場合も同じコードを使用して別の結果を得ているということです。 アイデア ありがとう
編集:@ user152468のコメントと@Driesを読んだ後、私は@Transactionalアノテーションを自分のスケジューラクラスとその動作の不思議に追加しました。 @transactinal注釈は、EntityManagerをスレッドにバインドすると推測しています。おかげさまで
私は '@ scheduled'アノテーションがspring' @ transactional'アノテーションではうまくいきません。 Springはこれらのクラスからプロキシを構築し、同じメソッドで両方のアノテーションを処理することはできません。 – user152468
@transactionalアノテーションはどこでも使用していませんが、 – Juan
@RestControllerなどを使用すると暗黙的になる可能性があります。 – user152468