2012-03-28 3 views

답변

24

짧은 대답 : 아니요, 데이터베이스에 엔티티가 없습니다.

긴 대답 : hibernate는 트랜잭션이 커밋되거나 롤백 될 것인지를 알 때까지 (이 동작은 다른 FlushMode를 설정하여 변경할 수 있지만), SQL 호출을 호출하여 SQL을 DB로 보내지 만 여전히 DB 트랜잭션이있어 DB 트랜잭션이 롤백 될 때 롤백을 호출하면 자체 내부에서 수행 된 변경 내용이 제거되므로 실제로 저장되지 않습니다. . 구성된 트랜잭션 격리 수준에 따라 아마도 다른 트랜잭션이 저장 및 롤백 사이에 짧은 시간 동안 저장 한 EntityA를 어떤 방식으로 볼 수 있습니다. 또한 DB에서 읽을 때 플러시가 자동으로 호출되므로 명시 적으로 호출하는 경우의 99 %가 필요하지 않습니다. 한 가지 예외는 자동 롤백 테스트를 통한 단위 테스트입니다.

+0

저는 어떻게 든 실제 DB 트랜잭션을 닮은 하이버 네이트 트랜잭션에 대해 생각할 수 없었습니다. 고맙습니다 ! 이 질문을 확인할 수 있습니까? 나는이 질문에 당신이 대답했다는 것을 묻습니다. http://stackoverflow.com/questions/9903872/hibernate-session-save-creating-notcessor-insert-statements – kommradHomer

+1

이 부분의 대답은 정확하지 않습니다 : "최대 절전 모드로 삽입/업데이트를 보내지 않을 정도로 똑똑합니다. 트랜잭션이 커밋되거나 롤백 될 것인지를 알 때까지 DB "를 참조하십시오.Hibernate는 세션이 플러시 될 때마다 DB에 insert/updates를 전송할 것이다. 이것은 트랜잭션이 커밋되거나 롤백 될 것인지를 알기 전에 가능하다. – SteveT

+0

@SteveT .flush()를 호출하거나 트랜잭션을 커밋하지 않고 세션이 플러시되는 시나리오를 알고 있습니까? – ilcavero

19

session.save(a)를 호출 할 때 Hibernate는 기본적으로이 객체가 저장되어야하는 세션 내부의 어딘가를 기억합니다. 그가 바로 INSERT INTO...을 발행할지, 얼마 후 또는 커밋 할지를 결정할 수 있습니다. 이것은 성능 향상으로서, 트랜잭션이 롤백되면 Hibernate가 일괄 처리 삽입을하거나 피할 수 있습니다.

session.flush()에 전화 할 때, Hibernate는 데이타베이스에 대해 INSERT INTO...을 강제로 발급한다. 엔터티는 데이터베이스에 저장되지만 아직 커밋되지는 않았습니다. 트랜잭션 격리 수준에 따라 다른 실행중인 트랜잭션에서는 볼 수 없습니다. 그러나 데이터베이스 은 레코드에 대해을 알고 있습니다.

transaction.rollback()으로 전화하면 Hibernate는 데이터베이스 트랜잭션을 롤백합니다. 데이터베이스가 롤백을 처리하므로 새로 생성 된 객체가 제거됩니다.

이제 flush()이없는 시나리오를 고려해보십시오. 우선, 당신은 결코 데이터베이스를 건드리지 않으므로 성능이 더 좋고 롤백은 기본적으로 아무런 작업이 아닙니다. 반면 트랜잭션 격리 수준이 READ UNCOMMITTED이면 다른 트랜잭션이 커밋/롤백 이전에 삽입 된 레코드를 볼 수 있습니다. flush()이 없으면 Hibernate가 암시 적으로 flush()을 결정하지 않으면이 작업이 수행되지 않습니다.

+0

이 질문을하는 데있어 다른 질문을 할 수 있습니까? http://stackoverflow.com/questions/9903872/hibernate-session-save-creating-not-neccessary-insert-statements – kommradHomer

7

flushcommit과 혼동 스러울 것으로 생각됩니다.

flush()은 상태를 데이터베이스와 동기화하지만 커밋을 수행하지 않습니다. 트랜잭션에 의해 상태가 계속 표시되므로 롤백을 호출하여 롤백 할 수 있습니다.

질문에 대한 대답은 다음과 같습니다. 아니요, 데이터베이스에 엔티티 (a)가 없습니다.

+0

고마워요. 내 주요 혼란은 DB 사이트에서 실제 DB 트랜잭션에 대한 지식이 부족한 것이 었습니다. – kommradHomer

관련 문제