2009-10-06 2 views
3

NHibernate dialect에 대한 사용자 정의 예외를 등록해야합니다. 내가 NHibernate 테스트에 표시된대로 구현 및 등록 된 ISqlExceptionConverter. 그러나 코드에서 예외가 발생하면 변환되지 않습니다. 내 전환 코드 도 호출하지 않습니다.NHibernate를 사용하는 사용자 정의 예외 ISqlExceptionConverter

내 코드는 정말 간단하다 :

try 
{ 
     using (ISession sess = OpenSession()) 
     using (ITransaction tx = sess.BeginTransaction()) 
     { 
      .... 
      sess.Save(obj); // invalid object scheduled for inserting 
      ..... 
      tx.Commit(); // exception raises here 
     } 
} 

catch (UniquenessViolationException ex) 
{ 
// never came here, since exception was not converted and is of type 
HibernateException 

} 

내 ISqlExceptionConverter 구현 :

public class SqlExceptionConverter : ISQLExceptionConverter 
{ 
     public Exception Convert(AdoExceptionContextInfo exInfo) 
     { 
       var sqlEx = ADOExceptionHelper.ExtractDbException 
(exInfo.SqlException) as SqlException; 
       if (sqlEx != null) 
       { 
         if (sqlEx.Number == 2627) 
           return new UniquenessViolationException(exInfo.Message, sqlEx, 
exInfo.Sql); 
       } 
       return SQLStateConverter.HandledNonSpecificException 
(exInfo.SqlException, exInfo.Message, exInfo.Sql); 
     } 

어쩌면 내가 뭔가를 놓친?

+0

나는 단위 테스트에서 스택을 예외로 설정하려고하는 것과 비슷한 문제를 겪었습니다. Session.Flush에 대한 호출은 네이티브 OracleException을 던지고 등록 된 변환기 클래스를 실행하지 않습니다. –

답변

3

예외 변환기를 등록해야합니다. 코드에서

: config 파일에서

configuration.SetProperty(
    Environment.SqlExceptionConverter, 
    typeof(SqlExceptionConverter).AssemblyQualifiedName); 

는 :

<property name="sql_exception_converter"> 
     Name.Space.SqlExceptionConverter, MyAssembly 
</property> 

지금까지이 시도하지 않은, 단지 코드의 최대의 보았다. 희망, 그것을 나도 필요합니다 :-)

+0

감사합니다. 저는 변환기를 등록했습니다. 나는 또한 NHibernate 코드를 디버깅한다. 변환 작업을 수행 할 수있는 장소가 많이 있지만 세션을 플러시하는 동안 수행되지 않습니다 ... 확실하지 않습니다. 의도적으로 설계되었거나 뭔가 놓쳤습니다. –

+0

변환 할 것으로 예상되는 NH에 의해 예외가 throw되는 것은 무엇입니까? –

+0

Hibernate는 HibernateException을 발생시킨다. 또한 변환기 클래스에 중단 점을 설정하고 디버거가 충돌하지 않지만 런타임에 확인했습니다 - 변환기가 구성 개체에 올바르게 등록되었습니다. –

0

a known issue in NH 2.1.2 GA, fixed in 3.0.0 나타납니다. 패치는 r4932에 적용되었습니다. 즉, 일괄 처리가 Oracle 클라이언트에 대해 활성화 될 때 호출되지 않는 것으로 보입니다. 따라서 일괄 처리를 사용할 때 변환기가 손상된 것으로 간주됩니다.

관련 문제