EntityManager.flush의 기능은 무엇이며 왜 사용해야합니까?
데이터베이스에 개체를 저장하는 EJB가 있습니다. 내가 본 예에서이 데이터가 저장되면 (EntityManager.persist) EntityManager.flush (); 이 작업을 수행해야하는 이유는 무엇입니까? 저장중인 객체는 첨부되지 않았으며 나중에 메서드에서 사용되지 않습니다. 사실, 일단 저장되면 메서드가 반환되고 리소스가 해제 될 것으로 예상합니다. (예제 코드는 제거 호출에서도이 작업을 수행합니다.)
if (somecondition) {
entityManager.persist(unAttachedEntity);
} else {
attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
에 대한 호출 EntityManager.flush();
은 데이터가 데이터베이스에 즉시 유지되도록 강제합니다 EntityManager.persist()
(EntityManager 구성 방법에 따라 다름 : FlushModeType (AUTO 또는 COMMIT) 기본적으로 AUTO로 설정되고 플러시가 다음으로 설정되면 자동으로 수행됨). 트랜잭션이 커밋 될 때 기본 데이터베이스에 대한 데이터의 지속성이 지연됩니다.
EntityManager.persist()
엔티티를 영구적으로 만드는 반면 EntityManager.flush()
실제로 데이터베이스에서 쿼리를 실행합니다.
따라서를 호출하면 EntityManager.flush()
관련 항목을 삽입 / 업데이트 / 삭제하기위한 쿼리가 데이터베이스에서 실행됩니다. 제약 조건 실패 (열 너비, 데이터 유형, 외래 키)는이 시점에서 알려집니다.
구체적인 동작은 플러시 모드가 AUTO인지 COMMIT인지에 따라 다릅니다.
이 EntityManager.flush()
작업은 트랜잭션이 커밋되기 전에 데이터베이스에 대한 모든 변경 내용을 쓰는 데 사용할 수 있습니다. 기본적으로 JPA는 트랜잭션이 커밋 될 때까지 일반적으로 데이터베이스에 변경 사항을 기록하지 않습니다. 이는 일반적으로 필요할 때까지 데이터베이스 액세스, 리소스 및 잠금을 방지하므로 바람직합니다. 또한 최적의 데이터베이스 액세스를 위해 데이터베이스 쓰기를 정렬하고 일괄 처리 할 수 있으며 무결성 제약 조건을 유지하고 교착 상태를 방지 할 수 있습니다. 당신이 지속 병합, 또는 데이터베이스 DML을 제거 호출 할 때이 수단 INSERT
, UPDATE
, DELETE
커밋 할 때까지 실행되지 않았거나 플러시가 트리거 될 때까지.
따라서을 호출 EntityManager.persist()
하면에서 엔터티를 관리하고 EntityManager
엔터티 인스턴스를 Persistence Context
. Explicit flush()
는 Persistence Context
SQL을 사용하여 데이터베이스로 이동할 현재에있는 엔티티를 만듭니다 .
flush ()가 없으면 Persistence Context
이것이 Persistence Context
연관된 트랜잭션 이 커밋 될 때이 (엔티티를 데이터베이스에서 데이터베이스로 이동)가 발생합니다 .
'IT TIP' 카테고리의 다른 글
HTML5 Canvas drawImage 비율 버그 iOS (0) | 2021.01.07 |
---|---|
멤버 함수 포인터를 통해 호출하는 방법은 무엇입니까? (0) | 2021.01.07 |
Elasticsearch의 모든 문서 덤프 (0) | 2021.01.07 |
파이썬에서 중괄호와 대괄호의 차이점은 무엇입니까? (0) | 2021.01.07 |
RxJava가 Observable을 병렬로 가져 오기 (0) | 2021.01.07 |