2017-11-17 8 views
0

회사 및 엔티티 호출 토큰이 있습니다.최대 절전 모드에서 더티 검사를 피하는 방법

1 회사에 많은 토큰이 있습니다. 내 회사 엔티티에 따라서

, 나는 다음과 같은 것이다 : 그러나

@OneToMany(mappedBy = "companyId") 
public Set<Token> getTokens() { 
    return tokens; 
} 

, 나는 반환하는 동안 몇 가지 논리가됩니다, 그것은 다음과 같이 반환하기 전에 뭔가를 토큰 목록을 변경합니다 :

@OneToMany(mappedBy = "companyId") 
public Set<Token> getTokens() { 
    tokens.remove(token); 
    return tokens; 
} 

나는 토큰 목록의 값을 변경하므로 최대 절전 모드를 사용하여 db에서 회사 개체를 선택할 때마다 회사 테이블이 자동으로 업데이트됩니다.

내 이해에 따라, 이것은 최대 절전 모드의 더티 검사 동작입니다. 따라서 Hibernate가 변경 사항을 감지하면 데이터베이스에 대한 업데이트를 수행합니다.

이것을 피할 수있는 방법이 있습니까? 예를 들어, 단지 기존의 hibernate 함수를 호출 할 수 있습니다. 그래서 hibernate는 토큰리스트가 더럽다는 것을 알게 될 것이고, 업데이트를하지 않을 것입니다.

예, getTokens()의 필터링 논리가 적합하지 않음을 알고 있습니다. 오른쪽 필터링 논리가 엔티티 수준에서 적용되지 않아야합니다. 그러나 현재이 방법을 사용하는 곳이 많기 때문에이 엔티티 수준에서 변경하면 다른 곳에도 영향을 미치고 다른 곳도 변경하면 전체 응용 프로그램을 다시 테스트해야합니다.

따라서 더 나은 방법을 찾으려고합니다.

+1

하나의 대체는 원래 데이터의 복사본을 생성하고 복사 된 데이터를 복사 한 데이터에 논리를 수행하고 반환 :
아마 아래의 구현이 도움이 될 것입니다. –

답변

1

실제로 원하는 것은 Hibernate가 자동 flushing을 방지하는 것입니다.

hibernate docs를 참조하십시오

플러싱은 메모리에 또한 지속 상태 기본 지속 저장소를 동기화하는 과정입니다.

FlushMode.MANUAL을 설정하여 FlushMode의 기본 구성을 자동에서 수동으로 변경하는 방법이 있습니다. 이런 식으로 더티 체크 메커니즘은 앞서 언급 한 동기화를 멈추게 할 것입니다.

hibernate documentation에 설명 된대로 Session.flush()이 명시 적으로 응용 프로그램에 의해 호출 될 때 Session은 항상 플러시됩니다.

는 여기 당신이 명시 적으로 홍조의 가격을 지불 할 필요가 제안 된 솔루션을 따르는 경우에 당신이 명시 적으로 호출 Session.flush() 방법 데이터베이스에 뭔가를 커밋 할 때마다해야한다는 것을 의미하는 것을 언급되어야한다.

FlushMode에 관한 유용한 자료는 최대 절전 모드 문서에 공식적으로 문서화되어 있습니다.

UPDATE :
이 솔루션은 세션에 적용됩니다, 그래서 당신은 단지 특정 개체에이를 적용 할 경우 두 가지 방법을 만들려고합니다.하나는 MANUAL로 설정하고 다른 하나는 기본 AUTO로 설정합니다. 이런 식으로 MANUAL 설정 후 값을 변경하여 세척을 방지하고 다른 엔티티에 영향을 미치지 않도록 기본값으로 다시 설정합니다. 대신 원래의 데이터를 변경, 당신이 할 수있는

@Autowired 
private SessionFactory sessionFactory; 


@OneToMany(mappedBy = "companyId") 
public Set<Token> getTokens() { 
    setFlushModeManual(); 
    tokens.remove(token); 
    setFlushModeAuto(); 
    return tokens; 
} 

private void setFlushModeManual() { 
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.MANUAL); 
} 

private void setFlushModeAuto() { 
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO); 
} 
+0

예, 명시 적으로 Session.flush()를 호출해야합니다. 사실 나는이 모듈에서 최대 절전 모드의 더티 검사를 피하고 싶지만 다른 모듈은 검사하지 않기를 원한다. 나는이 회사에서만 적용 할 수있는 방법을 찾으려고 노력하고있다. getTokens()는 가능한지 확실치 않다. –

+0

해결 방법으로 내 대답을 업데이트했습니다. 시도해보고 도움이되는지 확인하십시오. –

+0

안녕하세요 @Anastasios, 미안하지만 아직도 그것에 대해 정말로 이해하지 못합니다. 'setFlushModeManual()'과'setFlushModeAuto()'메소드는 어떻게 작동할까요? 나는 어떤 용어 나 변수에'FlushMode'를 할당하지 않았습니다. 어떻게 getTokens 부분이 Manual이나 Auto가 될지 이해할 수 있을까요? 나는 꽤 동면하는 새로운 있습니다. –