NHibernate에서 ID와 유형 만있는 엔티티를 어떻게 삭제할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1323427

  •  19-09-2019
  •  | 
  •  

문제

nhibernate 2.1을 사용하여 ID와 유형 (매핑에서와 같이) 만있는 엔티티를 어떻게 삭제할 수 있는지 궁금합니다.

도움이 되었습니까?

해결책

게으른 하중을 사용하는 경우로드는 프록시 만 생성합니다.

session.Delete(session.Load(type, id));

NH 2.1을 사용하면 HQL을 사용할 수 있습니다. 실제로 어떻게 생겼는지 확실하지 않지만 다음과 같은 것입니다. 이것은 SQL 주입의 대상이됩니다. 가능하면 setParameter ()와 대신 매개 변수화 된 쿼리를 사용하십시오.

session.Delete(string.Format("from {0} where id = {1}", type, id));

편집하다:

로드의 경우 ID 열의 이름을 알 필요가 없습니다.

알아야 할 경우 NH 메타 데이터로 얻을 수 있습니다.

sessionFactory.GetClassMetadata(type).IdentifierPropertyName

또 다른 편집.

session.Delete() 실체를 인스턴스화하고 있습니다

session.delete ()를 사용할 때 NH는 어쨌든 엔티티를로드합니다. 처음에 나는 그것을 좋아하지 않았다. 그런 다음 장점을 깨달았습니다. 엔티티가 상속, 수집 또는 "모든"참조를 사용하여 복잡한 구조의 일부인 경우 실제로는 더 효율적입니다.

예를 들어, 클래스 인 경우 A 그리고 B 둘 다 상속합니다 Base, 테이블에서 데이터를 삭제하려고하지 않습니다 B 실제 엔티티가 유형 일 때 A. 실제 물체를로드하지 않으면 불가능합니다. 이것은 각각 많은 추가 테이블로 구성된 많은 상속 유형이있을 때 특히 중요합니다.

컬렉션이있을 때도 같은 상황이 주어집니다. BaseS, 모든 사례입니다 A. 메모리에 컬렉션을로드 할 때 NH는 제거 할 필요가 없다는 것을 알고 있습니다. B-물건.

단체 인 경우 A 모음이 있습니다 B포함 된 S Cs (등), 그것은 삭제하려고 시도하지 않습니다. Cs 모음 BS는 비어 있습니다. 이것은 컬렉션을 읽을 때만 가능합니다. 이것은 C가 자체적으로 복잡하여 더 많은 테이블 등을 집계 할 때 특히 중요합니다.

구조가 더 복잡하고 역동적 일수록 "맹목적으로"삭제하는 대신 실제 데이터를로드하는 것이 더 효율적입니다.

HQL 삭제에는 함정이 있습니다

HQL은 데이터를 메모리에로드하지 않도록 삭제합니다. 그러나 HQL 붕대는 그다지 똑똑하지 않습니다. 기본적으로 엔티티 이름을 해당 테이블 이름으로 변환하고 데이터베이스에서 제거합니다. 또한 일부 집계 수집 데이터를 삭제합니다.

간단한 구조에서는 이것이 잘 작동하고 효율적 일 수 있습니다. 복잡한 구조에서 모든 것이 삭제되는 것은 아니며 제약 위반 또는 "데이터베이스 메모리 누출"을 초래합니다.

결론

또한 NH로 삭제를 최적화하려고 노력했습니다. NH는 여전히 더 똑똑하기 때문에 대부분의 경우를 포기했습니다. 내가 쓴 가장 복잡한 삭제 알고리즘 중 하나는 NH 매핑 정의를 분석하고 삭제 명령문을 작성하는 것입니다. 그리고 놀랍지 않습니다 - 삭제하기 전에 데이터베이스의 데이터를 읽지 않으면 불가능합니다. (단지 기본 키만로드하도록 줄였습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top