flush() 메소드에 대한 정보를 수집하고 있었지만 사용시기와 사용법이 명확하지 않습니다. 필자가 읽은 바에 따르면, 퍼시스턴스 컨텍스트의 내용이 데이터베이스와 동기화 될 것입니다. 이자형. 미해결 진술을 발표하거나 엔티티 데이터를 새로 고침합니다.JPA/Hibernate에서 flush()의 올바른 사용
이제 두 개의 엔티티 A
과 B
(일대일 관계이지만 JPA에 의해 시행되거나 모델링되지 않음)이있는 시나리오가 있습니다. A
에는 수동으로 설정된 복합 PK가 있으며 자동 생성 IDENTITY 필드 recordId
이 있습니다. 이 recordId
은 A
에 대한 외래 키로 엔티티 B
에 쓰여 져야합니다. 단일 거래 내에서 A
과 B
을 저축하고 있습니다. 문제는 A.recordId
을 으로 전화 한 후 em.flush()
을 명시 적으로 호출하지 않는 한 거래 내에서 자동 생성 된 값 A.recordId
을 사용할 수 없다는 것입니다. (IDENTITY PK가 자동으로 생성 된 경우 해당 값이 엔티티에서 직접 업데이트되지만 여기서는 그렇지 않습니다.)
em.flush()
은 트랜잭션 내에서 사용할 때 해를 끼칠 수 있습니까?
그가 말한 내용. em.flush() 비헤이비어는 java.io.Flushable.flush()를 반향합니다. 버퍼 된 모든 데이터는 적절한 대상으로 보내집니다. – Erik
flush()가 데이터베이스에 데이터를 보내는 경우? 그 이후에 예외가 발생하면 어떻게됩니까? 엔티티 관리자가 모든 것을 롤백합니까? 심지어 첫 번째 플러시에서 작성된 데이터? –
flush()는 INSERT, UPDATE 등과 같이 SQL 명령어를 데이터베이스에 보냅니다. COMMIT를 보내지 않으므로 flush() 후에 예외가 발생해도 완전한 롤백이 가능합니다. – Flavio