2012-08-31 3 views
10

최대 절전 모드에서 영구 객체의 자동 업데이트를 중지 할 수 있습니까?hibernate/JPA에서 자동 업데이트를 비활성화하는 방법

@Transactional 
    public ResultTO updateRecord(RequestTO requestTO) { 

     Entity entity = dao.getEntityById(requestTO.getId()); 

     // now update the entity based on the data in the requestTO 

     ValidationResult validationResult = runValidation(entity); 

     if(validationResult.hasErrors()) { 
      // return ResultTO with validation errors 
     } else { 
      dao.persist(entity); 
     } 
    } 

여기 코드에서 발생하는, 난, 영속 상태에있을 다음 나는 개체의 일부 필드를 업데이트하려면 최대 절전 모드로 간주 될 수 엔티티를 검색 한 후 검증에 엔티티를 전달합니다. 유효성 검사가 실패하면 udpate하지 않고 유효성 검사가 성공하면 엔티티를 지속시킵니다.

이 흐름의 주요 문제는 다음과 같습니다. 유효성 검사에 사용할 엔터티를 업데이트했기 때문에 (DAO에서) persist() 메서드를 호출하는지 여부는 중요하지 않으며 레코드는 항상 hibernate가 엔티티가 변경되었음을 감지하고 업데이트를 위해 플래그를 지정하기 때문에 업데이트되어야한다.

나는 유효성 검사를 수행하고 문제를 해결할 방법을 바꿀 수 있으므로 대안에 관심이 없습니다. 나는 영구 객체를 자동으로 업데이트하는 최대 절전 모드 기능을 비활성화 할 수있는 방법을 알고 싶어합니다.

JPA의 최대 절전 모드 구현을 사용하고 있습니다. 그래서 최대 절전 모드 특정 API를 다루는 Hibernate 특정 응답은 나를 위해 작동하지 않을 것이다.

최대 절전 모드 구성을 찾고이 동작을 중지하도록 구성 할 수 있는지 확인했지만 운이 없었는지 확인하려고했습니다.

감사

--edit --- 나는이에 대한 해결책을 찾을 수 없습니다, 그래서 내가 사용하여 선언적인 트랜잭션에있어 비록 어떤 RuntimeException을 던지는없이 트랜잭션을 롤백로 선택했다 :

TransactionInterceptor.currentTransactionStatus(). setRollbackOnly();

매력처럼 작동합니다.

답변

0

유효성 검사가 실패하고 호출자가 처리하지 않으면 예외가 발생합니다.

+0

감사합니다,하지만 난 메신저 해결 방법을 찾고 있지 말했듯이, 나는 이미, 메신저 자동 업데이트를 불능으로 수에 특정 구성을 찾고 있다고합니다. – lutfijd

1

세션에 대해 FlushMode를 구성하십시오.

http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

+0

이것은 주로 Hibernate가 쿼리를 실행하기 전에 어떻게 동작하는지 (부실 데이터를 피하기 위해 flush 또는 not)에 관련된 Hibernate 특정 API이다. JPA EntityManager는 플러시 모드를 설정할 수 있지만 조회 관리에만 관련됩니다. 여전히 여러 유형으로 EntityManager에서 플러시 모드를 설정하려고 시도했지만 여전히 차이를 만들지 않았습니다. – lutfijd

+0

@user 귀하의 의견은 분명하지 않습니다. 위에서 붙여 넣은 링크는 명확하게 "플러시 전략을 나타냅니다. 플러시 프로세스는 상태 변경을 감지하고 SQL 문을 실행하여 데이터베이스 상태를 세션 상태와 동기화합니다." [link] (http://stackoverflow.com/questions/3220336/whats-the-use-of-session-flush-in-hibernate) –

+0

먼저 : 이것은 JPA API가 아닌 Hibernate 특정 API입니다. 두 번째 : JPA 플러시 모드 설정은 JPA에 커밋 및 자동 플러시 모드 유형이 2 개 있고 수동 모드가 없기 때문에 동작에 영향을주지 않습니다. 그래서 내 질문에 JPA에서 자동 업데이트를 비활성화하는 방법은 JPA 컨텍스트에서 도움이되지 않는 링크가 많기 때문에 어떻게해야합니까? – lutfijd

0

는 다음과 같은 코드를 호출 할 수 있습니다 :

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
관련 문제