2017-12-29 36 views
0

코드의 일부 무리를 얻었다 커밋 반영합니다. 내가 명시 적으로session.save()는 거래없이

<property name="hibernate.connection.autocommit">false</property> 

다양한 절전 모드 버전으로 시도 설정하지만 여전히 문제를 얻는다. 내가 전에

try 
    { 
     tx.begin(); 

     Person person = Person.builder().name("JAN").surname("NOWAK").age(30).build(); 
     session.save(person); 

     String s = null; 
     if (s == null) { 
      throw new Exception(); 
     } 

     tx.commit(); 
    } 

결과를 커밋 예외가 발생하더라도

가 같은, 사람은 내가 tx.commit 사용 여부 DB 에 추가된다() 또는 NOT.

편집 :

AUTO 내가 전에 예상대로 작동IDENTITY에서 엔티티를 생성 전략을 변경 한 후, DB의 변화가 커밋 한 후에 결정된다. 결과 :

Hibernate: select next_val as id_val from hibernate_sequence for update 
Hibernate: update hibernate_sequence set next_val= ? where next_val=? 
sout: tx.commit() 
Hibernate: insert into Person (age, name, surname, id) values (?, ?, ?, ?) 

그러나 사람이 왜 그렇게 설명 할 수 있을까?

+1

* tx.commit *을 호출하지 않는 한 변경 사항이 저장되지는 ​​않지만 여전히 거래 내에서 볼 수 있습니다 (일반적으로 DB 트랜잭션의 작동 방식) –

+0

tx가 없어도 . commit() 또는 커밋 데이터가 DB에서 여전히 발생하기 전에 Exception을 throw 할 때. –

+0

이것은 의심의 여지가 없습니다. https://stackoverflow.com/questions/14622962/what-is-transaction-commit-in-hibernate –

답변

0

save()를 사용하는 경우 save()는 호출시 식별자를 반환해야하므로 tx.commit()을 사용할 필요가 없습니다. 따라서 당신은 그 값이 db에 즉시 저장됩니다. 반면에 commit()을 사용하려면 persist()를 사용하십시오. 자세한 내용은 Here

+0

불행하게도 여전히 _insert_가 발생하지만 IDENTITY에서 SEQUENCE 또는 AUTO로 전략을 생성하는 엔티티를 변경하면 작동합니다. tx.commit() 후에 DB가 변경됩니다. –

+0

우리가 커밋하지 않고 트랜잭션 시간이 초과되면 어떻게됩니까? – tsolakp

+0

어떤 경우? save() 또는 persist(). –