session.save(a)
를 호출 할 때 Hibernate는 기본적으로이 객체가 저장되어야하는 세션 내부의 어딘가를 기억합니다. 그가 바로 INSERT INTO...
을 발행할지, 얼마 후 또는 커밋 할지를 결정할 수 있습니다. 이것은 성능 향상으로서, 트랜잭션이 롤백되면 Hibernate가 일괄 처리 삽입을하거나 피할 수 있습니다.
session.flush()
에 전화 할 때, Hibernate는 데이타베이스에 대해 INSERT INTO...
을 강제로 발급한다. 엔터티는 데이터베이스에 저장되지만 아직 커밋되지는 않았습니다. 트랜잭션 격리 수준에 따라 다른 실행중인 트랜잭션에서는 볼 수 없습니다. 그러나 데이터베이스 은 레코드에 대해을 알고 있습니다.
transaction.rollback()
으로 전화하면 Hibernate는 데이터베이스 트랜잭션을 롤백합니다. 데이터베이스가 롤백을 처리하므로 새로 생성 된 객체가 제거됩니다.
이제 flush()
이없는 시나리오를 고려해보십시오. 우선, 당신은 결코 데이터베이스를 건드리지 않으므로 성능이 더 좋고 롤백은 기본적으로 아무런 작업이 아닙니다. 반면 트랜잭션 격리 수준이 READ UNCOMMITTED
이면 다른 트랜잭션이 커밋/롤백 이전에 삽입 된 레코드를 볼 수 있습니다. flush()
이 없으면 Hibernate가 암시 적으로 flush()
을 결정하지 않으면이 작업이 수행되지 않습니다.
저는 어떻게 든 실제 DB 트랜잭션을 닮은 하이버 네이트 트랜잭션에 대해 생각할 수 없었습니다. 고맙습니다 ! 이 질문을 확인할 수 있습니까? 나는이 질문에 당신이 대답했다는 것을 묻습니다. http://stackoverflow.com/questions/9903872/hibernate-session-save-creating-notcessor-insert-statements – kommradHomer
이 부분의 대답은 정확하지 않습니다 : "최대 절전 모드로 삽입/업데이트를 보내지 않을 정도로 똑똑합니다. 트랜잭션이 커밋되거나 롤백 될 것인지를 알 때까지 DB "를 참조하십시오.Hibernate는 세션이 플러시 될 때마다 DB에 insert/updates를 전송할 것이다. 이것은 트랜잭션이 커밋되거나 롤백 될 것인지를 알기 전에 가능하다. – SteveT
@SteveT .flush()를 호출하거나 트랜잭션을 커밋하지 않고 세션이 플러시되는 시나리오를 알고 있습니까? – ilcavero