Spring+Hibernate+Jpa 내장 사무 형 서비스 점적
2513 단어 Java
환경.
spring4.2.5+hibernate4.3.11+jpa2.1
spring xml 설정 은 주석 트 랜 잭 션 방식 을 사용 합 니 다:
문제 설명
service1.method--->(호출)service2.method,1 과 2 가 모두 사 무 를 시작 하고 1 이 열 린 읽 기와 쓰기 사무,
기본 적 인 상황 에서 2 는 트 랜 잭 션 1 에 포 함 됩 니 다.즉,전파 유형 은 Propagation.REQUIRED 입 니 다.
따라서 1 에서 어떤 실 체 를 만 들 었 을 때 제출 하지 않 고 2 를 호출 하기 시작 합 니 다.
2 에서 돌아 올 때 hibenate 는 자동 으로 flush 를 만 듭 니 다.이 때 는 hibenate session 이 고 1 에서 만 든 실체 도 flush 에서 db 로 갑 니 다.
1 에서 만 든 실체 가 완전 하지 않 아서 sql 오류 가 발생 할 수 있 습 니 다.
1.자신 이 끝나 기 전에 전체 실 체 를 구축 하고 flush 를 db 에 제출 하 는 것 은 잘못 되 지 않 지만 2 는 flush 에 게 미리 주 었 습 니 다.
해결 방법
4
4.567917.만약 에 2 가 업무 가 필요 하고 1 과 같은 업무 가 되 기 를 바란다.hibenate 의 flush mode 를 COMMIT 로 설정 해 야 합 니 다.xml 에서 설정:
...
${hibernate.dialect}
${auto.ddl}
COMMIT
...
4.567917.2 업무 가 필요 할 때 hibenate 속성 설정 을 통 해 이 루어 지지 않 고 코드 에서 이 루어 질 수 있 습 니 다.즉,1.2 를 호출 하기 전에 flushmode 를 COMMIT 로 설정 하고 2 를 호출 한 후에 원래 의 flushmode 로 복원 합 니 다
@PersistenceContext(unitName="entityManagerFactory")
private EntityManager entityManager;
...
@Transactional
public void method(){ // service1
...
FlushModeType orgFlushModeType = entityManager.getFlushMode();
entityManager.setFlushMode(FlushModeType.COMMIT);
Map> dbTrackingMap = null;
try {
service2.method();
} finally {
entityManager.setFlushMode(orgFlushModeType);
}
...
}
...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.