업데이트 메서드 호출 없이 트랜잭션 저장
저는 @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가 데이터베이스에 지속됩니까?
최대 절전 모드는 영구 엔티티에 대한 변경 사항을 자동으로 감지하고 그에 따라 데이터베이스를 업데이트하기 때문입니다.이 동작은 최대 절전 모드 참조 매뉴얼의 11장에 설명되어 있습니다.관련 부분은 다음과 같습니다.
최대 절전 모드에서는 다음과 같은 개체 상태를 정의하고 지원합니다.
과도 - 개체가 새 연산자를 사용하여 인스턴스화되었지만 최대 절전 모드 세션과 연결되지 않은 경우 일시적입니다.데이터베이스에 지속적인 표현이 없으며 식별자 값이 할당되지 않았습니다.응용 프로그램에 더 이상 참조가 없는 경우 가비지 수집기에서 일시적 인스턴스가 삭제됩니다.최대 절전 모드 세션을 사용하여 개체를 영구적으로 설정합니다. 그리고 이 전환에 대해 실행해야 하는 SQL 문은 최대 절전 모드에서 처리합니다.
영구 - 영구 인스턴스에는 데이터베이스에 표시되는 표현과 식별자 값이 있습니다.저장되거나 로드되었을 수도 있지만 세션의 범위에서는 정의되어 있습니다.최대 절전 모드는 영구 상태의 개체에 대한 변경 사항을 감지하고 작업 단위가 완료되면 상태를 데이터베이스와 동기화합니다.개발자는 객체를 일시적으로 만들어야 할 때 수동 UPDATE 문 또는 DELETE 문을 실행하지 않습니다.
분리됨 - 분리된 인스턴스는 지속적이지만 해당 세션이 닫힌 개체입니다.물론 개체에 대한 참조는 여전히 유효하며 분리된 인스턴스는 이 상태에서 수정될 수도 있습니다.분리된 인스턴스를 나중에 새 세션에 다시 연결하여 해당 인스턴스(및 모든 수정 사항)를 다시 영구적으로 유지할 수 있습니다.이 기능을 사용하면 사용자가 생각하는 시간이 필요한 장시간 실행 작업 단위의 프로그래밍 모델을 사용할 수 있습니다.우리는 그것들을 애플리케이션 트랜잭션, 즉 사용자의 관점에서 작업 단위라고 부릅니다.
JPA를 사용하는 경우 규격에 명시된 것보다 엔티티가 관리 상태(활성 트랜잭션 내에서 DAO에서 데이터를 가져와 이 상태)이면 JPA에 대해 변경된 모든 내용이 트랜잭션 커밋 중에 데이터베이스에 반영됩니다.
즉, 트랜잭션 커밋이 데이터베이스에 대한 변경사항을 플러시하기 때문에 업데이트 작업을 호출할지 여부는 중요하지 않습니다.
저는 용한사를 요.@Transactional(readOnly = true)
그것을 해결하기 위해
데이터베이스에 대한 자동 업데이트를 방지하는 것은 2단계 프로세스라는 것을 알게 되었습니다.
단계 I: :
getSession().setFlushMode(FlushMode.MANUAL) // [FlushMode.NEVER is depracated in 4.x]
단계 II:
getSession().clear(); //This will actually discard all changes
JPA의 경우 전화하십시오.entityManager.detach(entity)
자동 플러시를 방지합니다.그러나 분리된 엔티티는 게으른 가져오기, 캐스케이드 업데이트와 같은 후 ORM 마법을 잃게 된다는 점을 알아야 합니다.
언급URL : https://stackoverflow.com/questions/8190926/transactional-saves-without-calling-update-method
'source' 카테고리의 다른 글
ASP.NET MVC에서 레이저 @Url을 사용하려면 어떻게 해야 합니까?C# 코드의 내용() 도우미? (0) | 2023.08.09 |
---|---|
텍스트 파일의 내용을 파워셸의 정규식으로 바꾸기 (0) | 2023.08.09 |
스위프트에서 열거형을 프로토콜에 맞게 만드는 방법은 무엇입니까? (0) | 2023.08.09 |
Mongoose - 실행 기능은 무엇을 합니까? (0) | 2023.08.09 |
아래쪽 점이 있는 Android ViewPager (0) | 2023.08.09 |