2009-07-21 5 views
0

연관 테이블과 cascade = "save-update"를 사용하여 두 엔티티간에 다 대다 관계를 정의했습니다.NHibernate 추가 UPDATE 쿼리 실행

Entity1에는 Entity2 목록이 들어 있으며 반대로 Entity2에는 Entity1 목록이 들어 있습니다. 이 worflow에서 출력 된 SQL은 ...

  1. 전화 session.Save Entity1
  2. 에 Entity1의 목록에 Entity2 추가 Entity1 및 Entity2 객체를 만들기를 좋아 보인다

-> 삽입 문은 두 엔티티 모두에 대해 실행 된 다음 연관성 테이블에 삽입 된 레코드를 함께 연결합니다. Entity2에 I 처음 전화 session.Save이 목록에 추가하는 경우

그러나, 다음 Entity1에 session.Save 전화 것과 정확히 같은 Entity2의 모든 값을 설정하는 추가 UPDATE 문 실행이 처음에 삽입되었습니다.

아무런 문제가 없지만 성능을 저하시키는 추가 쿼리입니다. inverse 속성을 사용 했었지만 추가 업데이트 문을 제거하지는 않습니다. 현재 양쪽 엔 inverse = "false"가 있습니다. 어떤 엔티티가 저장된 지 상관없이 연관 테이블을 업데이트하기를 원합니다.

아이디어가 있으십니까?

답변

0

응답 해 주셔서 감사합니다.하지만 문제를 발견했다고 생각합니다. CRUD 작업을 구현 한 엔티티의 각 유형에 대한 저장소 클래스가 있습니다. 각 CRUD 작업은 자신의 세션/트랜잭션을 시작하고 Save/Update/etc라고 불렀고 트랜잭션/세션을 닫았습니다.

Session.Save for Entity2를 호출하면 Entity1 (Entity2 목록 포함)에 대한 session.Save가 세션에서 Entity2를 이미 유지 했으므로 레코드 업데이트를 시도하지 않는다는 것을 알 수 있습니다 .

반면에 session.ave를 Entity2로 호출 한 다음 session/save를 별도의 세션/트랜잭션에서 Entity2를 다시 업데이트하려고합니다. 나는 NH에 익숙하지 않아 어떤 객체를 업데이트해야 하는지를 어떻게 추적 할 지 모르지만 세션간에 다시 설정해야합니까?

Kinda는 내 멋진 DDD 저장소를 다소 덜 유용하게 만듭니다! 어쩌면 리포지토리는이 문제를 피하기 위해 싱글 톤 세션이나 비슷한 것을 사용해야합니까?

덕분에, 존

+0

는 세션이 스레드 아니라는 것을 기억하십시오.나는 대부분의 사람들이 aspnet 또는 'session-per-thread'에서 응용 프로그램에서 'Session-per-request'를 사용한다고 생각합니다. –

+0

예, 웹에서 다른 예제를 보면 세션을 관리하기위한 '단위 작업'을 구현해야합니다. 양식이 공개되면 양식 (내 경우에는 리치 클라이언트 응용 프로그램)을 인스턴스화하고 양식이 폐기 될 때 (세션 처분) 닫을 수 있습니다. – John

0

docs : inverse (선택 사항 - 디폴트는 false) : 가능하다면, Hibernate는이 join에 의해 정의 된 프로퍼티들을 삽입하거나 업데이트하려고 시도하지 않을 것이다.

나의 제안 : 어떤 경우에는 양방향으로 추가 업데이트를 방지하기 위해 조인 BOTH 컬렉션을 업데이트해야 할 수 있습니다

Contact c; 
Address a;  
c.Addresses.Add(a); 
a.Contacts.Add(c); 

양측이 역을 가지고 있기 때문에 당신은 아마 추가 업데이트 문을 얻고있다 = 거짓 첫 번째 엔티티의 관계 목록은 비어있게 저장되었습니다. 뉴 햄프셔는 모든 관계를 업데이트하기 위해 필요한 것이라고 생각하는 것을하고 있습니다.