2016-11-09 8 views
1

내가하고 싶은 것은 저장시 엔티티를 가로 채고 일부 문자열 속성을 잘라내는 것입니다.NHibernate Interceptor - OnFlushDirty

Entity에만 적용되고 Entity은 변경/업데이트되지 않는 것이 문제입니다.

그런 다음 OnFlushDirty() 인터셉터가 있습니다. 그러나 나는이 하나와 정말로 혼동합니다.

그래서 내가 좋아하는, 엔티티 업데이트에 대한 개체의 일부 속성을 수정하려면 :

public bool OnFlushDirty( 
      object entity, 
      object id, 
      object[] currentState, 
      object[] previousState, 
      string[] propertyNames, 
      IType[] types) 
{ 
     bool entityChanged = false; 
     for (int i = 0; i < propertyNames.Length; i++) 
     { 
      var stringType = types[i] as NHibernate.Type.StringType; 

      if (stringType != null) 
      { 
       if(NeedTruncate(currentState[i])) 
       { 
         currentState[i] = Truncate(currentState[i]); 
         entityChanged = true; 
       } 
      } 
     } 

     return entityChanged; 
} 

그래서 문제가 옆에 있습니다. this one 같은 블로그에서 엔티티가 변경되어 데이터베이스에 저장되면 OnFlushDirty()이 호출되므로 여기에있는 속성의 변경 사항이 데이터베이스에 저장되지 않습니다.

그러나 githab.io 문서에 말한다 :

인터셉터는 는 데이터베이스와 영속 객체 모두에 전파됩니다 감지의 currentState를 수정할 수 있습니다. 모든 플러시는 의 데이터베이스와의 실제 동기화에서 끝납니다. 새 currentState가 개체에 전파되지만 은 데이터베이스에 반드시 (즉시) 적용되는 것은 아닙니다. 은 인터셉터가 previousState를 수정하지 말 것을 강력하게 권장합니다.

또한 말한다 : 객체가 flush 동안에, 더러운 것으로 감지 될 때 호출

.

그래서 난 그냥, 정확하게 개체를 더러운 것으로 감지 될 때 호출

이 문서에 대한

또한

, 변경 사항이 데이터베이스에 저장됩니다 무엇을 의미하는지 확실하지 않다 꼭 필요한 것은 아닙니다.

어쨌든, 내 프로젝트에서 이것을 테스트하면이 기능이 작동하고 OnFlushDirty()이 호출되고 일부 속성 값이 변경되면 데이터베이스에 저장되고 모든 이음매가 제대로 작동합니다.

제 질문은 : 할 올바른지? 내가 말했듯이, 나는 프로젝트와 함께 그것을 테스트하고 엔티티를 변경/업데이트하는 경우 OnFlushDirty()이 호출되며 속성이 변경되어 데이터베이스에도 저장됩니다. 이 모든 내용과 약한 문서 때문에이 문제가 발생할 수 있는지 확실하지 않습니다.

답변

2

이와 비슷한 경우 인터셉터의 FindDirty 메소드를 덮어 쓰고 변경된 속성에 대한 인덱스 배열을 반환하거나 플러시 더티에서 변경할 것입니다.

경우에 따라 해당 메서드를 재정의하고 잘릴 수있는 문자열 속성이 있는지 여부를 해당 메서드에서 확인할 수 있습니다. 그렇다면 해당 속성의 색인을 반환하십시오.

이렇게하면 OnFlushDirty이 항상 필요할 때마다 호출되어야합니다.

그 다음으로, OnFlushDirty은 해당 메서드에서 영구 속성을 수정 한 경우 true를 반환해야합니다.이 코드는 여기에 게시 된 코드에서 볼 수있는 한 수행하지 않습니다.

+0

예, 영구 속성을 수정 한 경우 true로 반환됩니다. 문제의 코드로 실수 한 경우 지금 업데이트 된 코드를 확인하십시오. 일부 속성을 수정해야하고'OnFlushDirty'에서'true'를 반환해야한다면'FindDirty'를 오버라이드 한 후'OnFlushDirty'가 항상 존재한다는 것을 확신 할 수 있습니다 그것은 필요할 때 호출되며 객체 (Entity)와 데이터베이스에서도 속성을 업데이트 할 것입니다. – carpics

+0

그냥'FindDirty'가'int []'int의 배열을 반환하고, 그것을 덮어 쓰고'true '를 반환 할 수 있습니다. – carpics

+0

나는 내 대답을 약간 업데이트했습니다. FindDirty 메서드에서 속성 자체를 수정할 수 있는지 여부는 확실하지 않습니다. –