2009-07-19 2 views

답변

67

9 장 모든이의 더 나은을 다룹니다. 개체는 INSERT '일 것입니다.

Update()은 식별자가 있지만 세션에없는 기존 개체를 가져 와서 세션에 연결합니다. 개체는 UPDATE '일 것입니다.

SaveOrUpdate()은 식별자를보고 위의 내용을 결정합니다.

SaveOrUpdateCopy()은 동일한 식별자가있는 두 개의 객체 (세션에있는 객체와 그렇지 않은 객체)가 있다는 점에서 특별합니다. 시도하고있는 경우 update 세션에없는 예외가 정상적으로 throw됩니다 (이제는 세션에 동일한 영구 객체를 나타내는 두 개의 객체를 연결하려고합니다). SaveOrUpdateCopy()은 비 세션 객체 상태를 세션 객체 상태로 복사합니다.

NH을 어떻게 사용할지 잘 모르겠지만, 많은 경우에 필요한 것은 모두 Save()입니다. 세션은 업데이트해야 할 사항을 알기 위해 필요한 모든 작업을 수행하고 있으며, 단지 Flush() 또는 Commit() 만 있으면됩니다.

+2

일반적으로 SaveOrUpdate()가 필요하지 않습니다. 왜냐하면 NHibernate는로드 된 모든 객체에 변경을 추적하기 때문입니다. 개체를 업데이트하려면 Session.Get()을 사용하고 Session.Flush()를 호출하여 변경하십시오. –

+0

'SaveOrUpdate()'또는'Flush()'/'Commit()'코드에서 더 읽기 쉽고 의도가 드러나는 것은 무엇입니까? 아니면 (의미 론적 또는 다른 방식으로) 차이를 만들어 내지 않는가? –

+0

세션을 명시 적으로 플러시하지 않아도됩니다. 트랜잭션을 커밋하거나 세션이 범위를 벗어나거나 폐기되는 경우 변경 사항은 자동으로 지속됩니다 (또는 어떤 이유로 든 필요한 경우 이전, ID 생성 등). 플러시는 읽기 ioslation 또는 다른 esoterica 때문에 자동으로 변경을 강제 할 필요가있을 때 의도적으로 나타냅니다 (나에게). NH에 익숙한 사람이라면 첨부 된 엔티티에 대한 암시적인 'Update'도 이해할 것이므로 명시 적 SaveOrUpdate 문과 동일하게 생각하는 경향이 있습니다. –

관련 문제