Spring+Hibernate+Jpa 내장 사무 형 서비스 점적

2513 단어 Java
최근 에 팀 형제 와 함께 사무 형 service 내장 호출 로 인 한 문 제 를 처리 하여 정리 했다.
환경.
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
  • 2 사 무 를 열지 않 으 면 service2.method 에 주 해 를 추가 합 니 다@Transactional(readOnly=true,propagation=Propagation.NOTSUPPORTED)이 때 2 시 1 분 까지 실 행 된 사 무 는 걸 리 고 2 시 에 사 무 를 열지 않 으 며 끝 날 때 flush db 가 틀 리 지 않 습 니 다

  • 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);
        }
    ...
    }
    ...
  • 또한 2 가 필요 한 사무 일 뿐 이지 만 1 과 다른 사무 일 수 있다 면 2 의 사무 전파 유형 을@Transactional(readOnly=true,propagation=Propagation.REQUIRES 를 사용 할 수 있 습 니 다.NEW),깊이 테스트 하지 않 으 면 독자 가 스스로 테스트 할 수 있다
  • 좋은 웹페이지 즐겨찾기