2011-04-26 3 views
12

레거시 데이터베이스 (여전히 레거시 PHP 클라이언트가 있음)에서 최대 절전 모드를 구현하려고하는데 원본 응용 프로그램을 작성한 사람들이 그들이 무엇을하고 있었는지 생각해보십시오.레거시 데이터베이스를 다룰 때 누락 행에 최대 절전 모드가 있습니다.

데이터베이스가 설정되어있어 어떤 열도 Null을 허용하지 않으므로 레코드가 없으면 외래 키는 0으로 기본 설정됩니다. 또한 테이블에 적절한 외부 키가 없으므로 유효하지 않은 ID가있는 키가 몇 개 있습니다. 스키마를 변경하거나 해당 열을 null로 지정할 수있는 옵션이 없습니다.

내가 최대 절전 모드에서 얻을 오류입니다 :

Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0] 

내가하고 싶은 것은 필드 행이 유효하지 않은 단지 널 않을 경우 또는 존재하지 않는이 추문에 대처하는 우아한 방법입니다 ,하지만 나는이 문서를 처리하는 방법을 찾는 행운이 없다.

팁이 있습니까?

답변

14

주석 : @NotFound (액션 = NotFoundAction.IGNORE)

내가 찾고 있던합니까 정확히. 제안에 대한

Hibernate Many-To-One Foreign Key Default 0

+1

내가 찾고 있던 출발점. Hibernate 매핑 파일의 경우, 속성은 'not-found1'이다 (예 :'') – jdknight

2

나는 Hibernate가 이런 유형의 문제에 잘 부합하지 않는다고 생각한다. Hibernate는 당신의 테이블에있는 레코드가 서로 관련 될 것을 기대하며, 외래 키 관계가 간혹 적용되는 경우에는 실제로 작동하지 않는다. Hibernate 이 깨지기 쉬운 외래 키 관계를 처리하는 방법을 알고 이런 식으로 동작하도록 변경하거나 구성하는 것이 쉽지 않을 것이라고 생각합니다.

MyBatis SQLMaps과 같은 프레임 워크에서 더 많은 마일리지를 얻을 수 있습니다. 여기서는 프로그램 외부의 파일에 데이터를로드하기 위해 SQL 문을 제공하지만 프레임 워크는 SELECT 문을 함께 사용하여 전체 개체 그래프를로드 할 수있는 옵션을 제공합니다. 이 방법을 사용하면 0 값을 필터링하는 논리로 SQL 문을 보완 할 수 있습니다.

+0

감사합니다,하지만 난 최대 절전 모드와 붙어 : 여기를 통해 발견했다. 지금까지 _decent_ 해결 방법을 찾았지만 특정 예외를 잡아두고 필드를 null로 설정할 수 있으면 좋을 것입니다. – liam

1

나는 interceptor이 트릭을 할 수 있다고 생각합니다.

+0

인터셉터를 체크 아웃하고, 감사 로그를 생성하는 데 사용하는 몇 가지 예제 이외에도 너무 일반적인 것으로 보입니다.필자가 다른 곳에서 언급 한 주석은 내가 원하는 것을 끝내었다. – liam

0

나는 비슷한 문제가있는 레거시 데이터베이스에 대해 최근에 webapp을 프로그래밍했습니다. 다중 데이터 액세스 프레임 워크를 사용하지 않으려는 경우에도 최대 절전 모드를 사용할 수 있습니다. 내가 한 것은 'createSqlQuery'를 사용하여 까다로운 부분에 대한 네이티브 SQL 쿼리를 작성하는 것입니다. 어떤 경우 엔 완전한 서브 쿼리 나 계산 된 값을 엔티티 프로퍼티에 매핑해야했지만 작동합니다. 좀 더 규칙적인 데이터베이스의 부분들에 대해서 나는 정규 Hibernate 매핑과 criteria/HQL 쿼리를 여전히 사용할 수 있습니다.

또 다른 사실 : 어쩌면 당신은 '그들이 무엇을하고 있었는지 전혀 모르겠다'또는 'muck'과 같은 용어를 사용하지 않아야합니다. 전임자가 남긴 코드를 열등한 것으로 간주하는 것이 유혹적이지만이 사람들이 당시로서는 최선을 다한 것으로 알고 있습니다. 또한, 자신의 코드도 완벽하지 않으므로 일부 겸손이 자리 잡고 있습니다. 왜? 주변 사람들은 당신이 입맛에 대해 항상 지식이 있다고 생각했던 이전 개발자에 대해 항상 거품을 내고 있지 않다면 조금 나아질 수 있습니다. 그냥 팁.

+0

코드베이스를 보지 못했습니다. – liam

+0

내가 어떻게하지 않았는지 어떻게 확신 할 수 있습니까? 어쩌면 내가 쓴거야. –

관련 문제