[TroubleShooting (springboot)] No EntityManager with actual transaction available for current thread..
6260 ワード
SpringBootで発生したエラーです.エラーが発生した会員情報ライブラリのコードは以下の通りです.
No EntityManager with actual transaction available for current thread
直訳の場合、エンティティマネージャは現在のスレッドで使用可能な実際のトランザクションを持っていません.
Springはあまり勉強しないので『どういう意味ですか?』と思います.
したがって、エンティティーマネージャは持続性コンテキストをどのように管理しますか?
トランザクションが正常に実行されると、コミットされ、実際のDBおよびエンティティーマネージャに反映されます.
JPAのすべてのロジックは、トランザクションで実行する必要があります.これはなぜですか.
これは、トランザクション・ユニットに基づいて、プライマリ・キャッシュ領域のオブジェクトがデータベースにリフレッシュされて永続化されるためです.
だからこの間違いの原因は?
これは、オブジェクトがこのような永続化操作を行うpersist()メソッドに入ったため、エラーですが、トランザクションは存在しません.
EntityManagerによるすべてのデータ変更は、トランザクションで行う必要があり、@Transactionalはテストメソッドで宣言されていません.
@Transactional. https://perfectacle.github.io/2018/01/14/jpa-entity-manager-factory/ https://sas-study.tistory.com/348
@RunWith(SpringRunner.class) // junit에게 스프링관련테스트할것을 알림
@SpringBootTest
class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
public void save() {
// given
Member member = new Member();
member.setUsername("member1");
// when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.findById(savedId);
// then
Assertions.assertThat(savedId).isEqualTo(findMember.getId());
Assertions.assertThat(member.getUsername()).isEqualTo(findMember.getUsername());
}
}
エラーの確認
No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
No EntityManager with actual transaction available for current thread
直訳の場合、エンティティマネージャは現在のスレッドで使用可能な実際のトランザクションを持っていません.
Springはあまり勉強しないので『どういう意味ですか?』と思います.
長呼吸で理解する
用語
EntityManager
はエンティティ管理クラスであり、マネージャ内に永続性コンテキストが管理されます.영속성 컨텍스트
は、永続的なストレージエンティティの環境です.트랜잭션
:データ変更はトランザクションで行う必要があるワークユニットです.flush
:永続性コンテキストの変更をdbに反映し、トランザクションが発生するとflushは操作を実行します.理解の順序
したがって、エンティティーマネージャは持続性コンテキストをどのように管理しますか?
トランザクションが正常に実行されると、コミットされ、実際のDBおよびエンティティーマネージャに反映されます.
JPAのすべてのロジックは、トランザクションで実行する必要があります.これはなぜですか.
これは、トランザクション・ユニットに基づいて、プライマリ・キャッシュ領域のオブジェクトがデータベースにリフレッシュされて永続化されるためです.
だからこの間違いの原因は?
これは、オブジェクトがこのような永続化操作を行うpersist()メソッドに入ったため、エラーですが、トランザクションは存在しません.
の原因となる
EntityManagerによるすべてのデータ変更は、トランザクションで行う必要があり、@Transactionalはテストメソッドで宣言されていません.
解決する
@Transactional.
@Test
@Transactional
public void save() {
...}
リファレンス
Reference
この問題について([TroubleShooting (springboot)] No EntityManager with actual transaction available for current thread..), 我々は、より多くの情報をここで見つけました https://velog.io/@redcarrot01/TroubleShooting-springboot-No-EntityManager-with-actual-transaction-available-for-current-threadテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol