2010-03-17 5 views
2

대리 ID 및 Natual ID가있는 Nhibernate 매핑이있는 개체가 있습니다. cource 이후 자연 ID는 고유하게 제한됩니다. 개체가 이미 동일한 자연 ID로 데이터베이스에 있으면 삽입 쿼리가 실패합니다. 내 솔루션이 삽입하기 전에 자연 ID가 데이터베이스에 있는지 확인하려면 수동으로 확인했습니다.고유 제약 Nhibernate

Natural Id/Unique Constraints에 삽입하기 전에 Nhibernate가 select를 수행하도록 지정하는 방법이 있습니까?

답변

1

어떤 식 으로든 DB로 가야합니다.

그러나 NH Validator를 사용하면 더 투명하게 할 수 있습니다.

는 파비오 Maulo에서 다음 게시물 읽기 : http://fabiomaulo.blogspot.com/2009/10/validation-through-persistence-not.html

+0

검사기는 어떻게 도움이됩니까? – Will

+0

Diego가 게시 한 링크는 NH Validator를 사용하여 BlogPost의 자연 ID (제목 및 날짜)가 위반되지 않았는지 확인하기 위해 데이터베이스를 쿼리하는 예입니다. 이것은 정확히 당신이 물어 본 것입니다 - 엔터티를 저장하려고 시도하기 전에, NHibernate는 select 쿼리가 실행되게하는 유효성 검사를 체크합니다. –

0

나는 보통 단지 (변경 사항을 제출) 삽입을 시도하고 결과 예외를 잡기로 시나리오의 종류를 해결한다.

어쨌든 DB에 충돌해야하므로 실패한 INSERT는 기본적으로 SELECT보다 비용이 저렴합니다 (저렴하지는 않음). 그리고 더 안전합니다.

+0

이러한 개체가 계단식 구성의 일부인 경우 문제가 발생합니다. 내가 정말로 걱정하지 않는 단일 객체는 그것이 업데이트되거나 삽입되면 전체 구조에 대한 트랜잭션이 중단됩니다. – Will

+0

그래서 둘 다해야합니다! – dariol

0

저장 또는 업데이트하기 전에 고유성을 검사합니다. 그런 다음 좋은 검증 메시지를 표시 할 수 있습니다. 예외를 읽고 제약 조건 위반을 올바른 필드와 일치시키는 것이 어렵다는 것을 알게되었습니다. 어쩌면 NH가 지원되는 데이터베이스에 대한 오류 코드를 추상화했는지 ... 나는 그것에 대해 조사하지 않았습니다. 드문 경우지만 검사와 저장간에 제약 조건이 위반되면 일반 오류 메시지가 표시됩니다.

1

Nhibernate에 대한 SaveOrUpdate 수신기를 만들었으므로 개체가 데이터베이스에 저장 될 예정이므로 고유성 검사 여부를 결정할 수 있습니다. 개체의 고유 한 속성이 데이터베이스에 있는지 확인하기 위해 대신 업데이트 (비관적 잠금)를 선택하여 행을 잠 가서 개체를 안전하게 병합하고 업데이트 할 수 있습니다. O (2N) 쿼리를 작성하지만 문제가되는 경우 단일 병합 문으로 단순화 할 수 있습니다.

http://en.wikipedia.org/wiki/Merge_(SQL)

+0

당신이 어떻게했는지 공유한다면 정말 좋을 것입니다. 나는 같은 상황에 처해 있으며 그러한 청취자를 수행하기 위해 싸우고있다. – flipchart

관련 문제