내가 무엇을 가지고 :최대 절전 모드 : session.createQuery 및 세션 캐시
나는 내 응용 프로그램의 주 패턴을 통합해야합니다. 즉, 어떤 엔티티의 상태를 변경하면 연쇄 반응이 발생할 수 있습니다. 관련 주체의 상태가 변경 될 수도 있음을 의미하며 관련 주체의 주체보다는 해당 주체 등을 의미합니다.
또한 최대 절전 모드 대화를 사용합니다. 즉, MANUL
플러시 모드를 사용하고 있습니다.
public void handler() {
session = beginHibernateConversation(); //open new transaction and new session (if it's needed)
entity.changeState(session); //call chain reaction
finishhibernateConversation(session); //manual flush, commit, and if it's needed - close session
}
어떤 문제 :
나는 모든 변경 사항은 finishhibernateConversation(session)
방법에 DB에 만들어진 수동 플러시 모드를 사용.
session.createQuery
방법은 changeState(session)
방법을 사용해야합니다. 그러나 나는 실제 주체 국가를 볼 수 없다! Beacause 모든 변경 사항은 unflushed 세션에 저장되며 session.createQuery
은 세션 컨텍스트와 관련이 없기 때문에 저장됩니다.
질문 :
어떻게 session.createQuery
이 session cache
을 고려하게?
약간의 예 : 예를 들어
내가 Person
이 - Job
관계 (one-to-many
을). 한 직장의 상태를 full time
으로 변경하면 관련 업무를 모두 업데이트해야합니다 (개인이 전일제로만 일할 수 있기 때문에).
그래서, session.createQuery("from Job where person.id = (:id) state in (:states)")
[제있어서 내부]
job1.changeState('full time')
- (사람 UPDATE 요청 내부)을 수행.
문제는 현재 몇 가지 옵션이 job1
1) 대화 때문에 FlushMode.AUTO를 사용할 수 없습니다. 대화는 사용자가 "CANCEL (취소)"버튼을 누르면 모든 변경 사항을 되돌려 야 함을 의미합니다. 3) 그것은 최악의 경우입니다. 2) 그러나 제발, 저에게 두 번째 대안을 설명해주십시오. –
자동 플러시는 해당 시나리오에서 작동합니다 (데이터베이스로 플러시되지만 데이터베이스 트랜잭션을 커밋하지 않음). 데이터베이스 잠금이 잘못 될 것이므로 권장하지는 않습니다. 두 번째 옵션의 의미는 다음과 같습니다. for (작업 작업 : person.getJobs()) { if (job.getState(). equals (State.SomeValue)) {return job; } } 등. –