복붙노트

[SPRING] 업데이트 방법을 호출하지 않고 트랜잭션 저장

SPRING

업데이트 방법을 호출하지 않고 트랜잭션 저장

@Transactional 주석이 달린 메소드가 있습니다. 내 Oracle DB에서 개체를 검색하고 필드를 변경 한 다음 메서드에서 반환합니다. 개체를 저장하는 것을 잊었지만 어쨌든 데이터베이스가 업데이트된다는 것을 발견했습니다.

applicationContext

<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

내 방법

@Transactional
public void myMethod(long id) {
    MyObject myObj = dao.getMstAttributeById(id);
    myObj.setName("new name");
    //dao.update(myObj);
}

내 질문은 왜 MyObject가 데이터베이스에 저장되는 것입니까?

해결법

  1. ==============================

    1.왜냐하면 Hibernate는 영속적 인 엔티티들에 대한 변경들을 자동적으로 감지 할 것이고 그에 따라 데이터베이스를 업데이트 할 것이기 때문이다. 이 동작은 최대 절전 모드 참조 설명서의 11 장에 설명되어 있습니다. 관련 부분은 다음과 같습니다.

    왜냐하면 Hibernate는 영속적 인 엔티티들에 대한 변경들을 자동적으로 감지 할 것이고 그에 따라 데이터베이스를 업데이트 할 것이기 때문이다. 이 동작은 최대 절전 모드 참조 설명서의 11 장에 설명되어 있습니다. 관련 부분은 다음과 같습니다.

  2. ==============================

    2.JPA를 사용하는 경우 엔티티가 관리되는 상태 (활성 트랜잭션 내에서 DAO로부터 데이터를 가져 오는 방식) 인 경우, 변경된 모든 내용이 JPA에 반영됩니다. 트랜잭션 커밋 중 데이터베이스.

    JPA를 사용하는 경우 엔티티가 관리되는 상태 (활성 트랜잭션 내에서 DAO로부터 데이터를 가져 오는 방식) 인 경우, 변경된 모든 내용이 JPA에 반영됩니다. 트랜잭션 커밋 중 데이터베이스.

    즉, 트랜잭션 커밋이 데이터베이스에 대한 변경 사항을 플러시하기 때문에 업데이트 작업을 호출하는지 여부는 중요하지 않습니다.

  3. ==============================

    3.데이터베이스 자동 업데이트 방지가 2 단계 프로세스임을 알게되었습니다.

    데이터베이스 자동 업데이트 방지가 2 단계 프로세스임을 알게되었습니다.

    1 단계 : :

    getSession().setFlushMode(FlushMode.MANUAL) // [FlushMode.NEVER is depracated in 4.x]
    

    2 단계 :

    getSession().clear(); //This will actually discard all changes
    
  4. from https://stackoverflow.com/questions/8190926/transactional-saves-without-calling-update-method by cc-by-sa and MIT license