2009-05-28 6 views
1

nHibernate에 대해 저를 괴롭히는 한 가지 사실은 100 % 컴파일 타임 테스트가 아니라는 것입니다.어떻게 nHibernate가 100 % 컴파일 시간을 테스트 할 수 없습니까?

데이터베이스 테이블의 열 이름을 바꾸고 해당 테이블의 매핑 파일을 업데이트하면 컴파일 할 때 해당 열 이름을 참조한 모든 쿼리 코드 (hql/criteria 등)에 오류가 발생합니다 어떻게 철자가 잘못되었는지.

ORM을 사용하는 모든 점 (어쨌든)은 데이터베이스 변경으로 인해 쿼리가 손상되지 않습니다. 즉

은, 내가 대신 점점 런타임 오류 등으로 고정 할 필요가 무엇인지 컴파일시에 통보됩니다

답변

4

원하는 것을 얻으려면 최선의 해결책은 Fluent NHibernatenhlambdaextensions의 조합을 사용하는 것입니다. Fluent NHibernate는 매핑 파일에 대해 타입 - 세이프 (type-safe) 검사를 제공 할 것입니다 (따라서 엔티티의 프로퍼티를 변경하면 매핑 클래스의 프로퍼티도 변경하지 않으면 컴파일러에서 오류가 발생합니다). 람다 함수 확장은 Criteria API (HQL이 아니라 매직 스트링 SQL-with-objects)를 통해 타입 안전 쿼리를 제공합니다. 또한

질문을 명확히하기 위해, 당신은 말했다 :

내 데이터베이스 테이블의 열 (이름 변경)을 변경, 나는 히트 I를 컴파일 할 때 나는 그 테이블에 대한 매핑 파일을 업데이트하는 경우 모두에서 오류가 발생합니다 내 쿼리 코드 (hql/criteria whatever) 어디에서 해당 열 이름 을 참조했으며 그 철자가 잘못되었습니다.

데이터베이스 측을 변경하면 아무 것도 없어지지 않습니다 (XML 매핑 파일을 변경한다고 가정 할 때). 코드 이 아니고 매핑의 column="first_name" 부분을 참조하면 name="FirstName" 부분을 참조합니다. 엔티티를 변경하지 않으면 데이터베이스에서 열 (예 : firstname "에서"first_name ")의 이름을 바꾸어도 매핑 파일을 업데이트하는 동안 쿼리가 중단되지 않습니다.

+0

아아아, 그렇다면 그것은 그 다음에 부끄러운 문제처럼 보입니다. 그 점을 지적 해 주셔서 감사합니다! – Blankman

+0

하지만 기준 쿼리로 인해 깨질 것입니다. 당신이 SetBlah ("asdf")를 할 때처럼 – Blankman

+1

우리는 여전히 DB 전용 변경에 대해 이야기하고 있다고 가정 할 때, 그것은 Criteria를 깨뜨리지 않아야한다. LastName이라는 속성을 가진 엔티티 클래스가있는 경우 Criteria 쿼리는 "LastName"을 참조합니다 (예 :'.Add (Restrictions.Eq ("LastName", "Example last name"))). 따라서 매핑 파일을 최신 상태로 유지하는 한 열 이름을 성, 성 또는 성 등으로 변경하더라도 문제가되지 않습니다. 코드 * 항상 * 코드를 참조합니다. . NH는 코드와 데이터베이스의 관심사를 분리합니다. –

0

Hibernate는 매핑 구성에 따라 매핑 클래스를 만들 수있는 동적 바이트 코드 생성을 사용 .

ORM의 기본 점은 객체와 관계형 시스템 사이에서 자동 마법 매핑 (브리지)을 가능하게하는 것입니다. 따라서 : ORM.

+0

하지만 내 검색어 (1000 개)가 열 이름 바꾸기 또는 크기 조정 등으로 인해 올바른 열로 매핑되지 않을 때 말할 수없는 경우에는 나에게 마술은 1/2 마술입니다. – Blankman

+0

nHibernate가 데이터베이스를 디자인하지 않습니다. 당신. 그것은 당신이 그들에게 매핑 할 수 있습니다. 디자인은 당신의 편입니다. 우리는 스크립트를 스키마 변경에 대한 소스 제어로 유지합니다. 그런 다음 어떤 매핑이 변경되었는지 알 수 있습니다. 스키마를 제어하지 않으면 nHibernate가 스키마를 제어하지 않는다. – D3vtr0n

+0

스키마 변경을 언급하지 않고 테스트 된 쿼리를 컴파일합니다. 컴파일 시간에 쿼리에 참조 된 열이 존재하지 않는다는 오류가 표시됩니다. – Blankman

0

제대로 테스트하지 않으면 런타임 문제가 많이 발생할 수있는 xml config를 사용하지 않고 강력하게 객체를 입력하려면 FluentNHibernate에서 코드의 데이터에 클래스를 매핑 할 수있는 규칙 맵이 있는지 살펴볼 것입니다. 내 인생을 많이 쉬워 특히 처음 NHibernate로 시작했을 때 내가 제대로 XML을 사용하여 매핑하는 방법을 알기 전에 발견했다면 좋겠다

1

당신은 Castle ActiveRecord을 봐야한다. 이전에이 파일을 사용했기 때문에 매핑 파일 (.hml)을 걱정하지 않아도됩니다. 클래스 레벨 정의에서 변경을 수행 할 수 있으며 맵핑 파일은 일반적으로 변경되지 않았습니다.

잘못된 쿼리를 작성하는 경우 디자인 문제와 유사하지만 nHibernate 문제는 아닙니다.

+0

나를 이해하면 나쁜 쿼리가 아니며 firstname을 말하도록 열 사용자 이름을 변경했기 때문에 작동하지 않습니다. 이제 내 쿼리를 업데이트해야합니다, 그냥 컴파일 시간을 확인하고 싶습니다. – Blankman

1

대부분의 사람들이 NHibernate에서 그들의 질의에 HQL을 사용하기 때문에 Property 이름이 변경되지 않았다는 에러를 얻지는 않을 것입니다.당신은 속성의 이름을 변경 할 아닌 HQL 당신은 참으로 :, 예컨대 깨진 쿼리를 얻을 성을

FROM User Where User.Surname = 'bob' 

변경 성 속성과 그것을 깰 수있을 것입니다 그러나합니다. 이것은 NHibernate에서 부족한 기능이지만, Subsonic 스타일의 질의 인터페이스 인 contrib을위한 좋은 프로젝트를 만들 것입니다. This a project 비슷하지만 여전히 HQL을 사용합니다.

위에서 언급 한 것처럼, ActiveRecordFluent NHibernate은 NHibernate와 타입 검사에 가장 가깝다. 두 가지 모두 당신이 기대하는대로 기본 클래스에서 클래스를 상속 받도록하고, ActiveRecord은 프로덕션 용도로 사용하지 않습니다. Ayende는 NHibernate의 프로토 타이핑 도구가 될 비디오에서 Ayende가 말했습니다.

0

NHibernate에는 Java 버전의 스키마 유효성 검사기와 동일한 기능이 있습니까? 어떤 경우에는 빌드 프로세스에 단계를 추가하여 세션 팩토리를 빌드하고 유효성 검사기를 실행할 수 있습니다. 세션 팩토리를 빌드하면 명명 된 쿼리도 컴파일해야하므로 유효성 검사도 가능합니다.

흠, 그것은 그런 일을 지원과 같습니다 http://nhibernate.info/blog/2008/11/22/nhibernate-schemavalidator.html

NB이 당신의 빌드 프로세스가 dev에 데이터베이스가 내가 나쁜 일이로 간주 것이다 --- 사용할 수없는 경우 작동하지 않을 것을 의미합니다.

관련 문제