IT TIP

EntityManager.flush의 기능은 무엇이며 왜 사용해야합니까?

itqueen 2021. 1. 7. 20:15
반응형

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 ContextSQL을 사용하여 데이터베이스로 이동할 현재에있는 엔티티를 만듭니다 .

flush ()가 없으면 Persistence Context이것이 Persistence Context연관된 트랜잭션 이 커밋 때이 (엔티티를 데이터베이스에서 데이터베이스로 이동)가 발생합니다 .

참조 URL : https://stackoverflow.com/questions/17703312/what-does-entitymanager-flush-do-and-why-do-i-need-to-use-it

반응형