2010-05-26 4 views
1

어떤 요소에도 포함되지 않은 루트 객체의리스트를 추적하고자한다. 나는 다음과 같은 의사 코드가 작동하려면 :Hibernate : 루트 객체를 가진 루트 콜렉션

using (session1 = [...]) { 
    IList<FavoriteItem>list = session1.Linq<FavoriteItem>().ToList(); 
} 

list.Add(item1); 
list.Add(item2); 
list.Remove(item3); 
list.Remove(item4); 
var item5 = list.First(i => i.Name = "Foo"); 
item5.Name = "Bar"; 

using (session2 = [...]) { 
    session2.Save(list); 
} 

이 자동으로 항목 1을 삽입하고 항목 2, 항목 3 및 항목 3 삭제하고 item5를 업데이트해야합니다 (즉, I는 별도로 모든 항목에 대한() sesssion.SaveOrUpdate를 호출하고 싶지 않아요.

using (session1 = [...]) { 
    var favs = session1.Linq<Favorites>(); 
} 
favs.FavoriteColors.Add(new FavoriteColor(...)); 
favs.FavoriteMovies.Add(new FavoriteMovie(...)); 

using (session2 = [...]) { 
    session.SaveOrUpdate(favs); 
} 
:

예를 들어 내가 이런 코드를 작성하려는 클래스의 즐겨 찾기와 그것과 이상의 맵이 수집 속성을 정의 할 테이블과 관련되지 않은 의사 엔티티를 정의하는 것이 가능

즐겨 찾기 즐겨 찾기 및 즐겨 찾기 동영상 즐겨 찾기 클래스의 유일한 속성이며 IList 및 IList 유형입니다. 즐겨 찾기 클래스가 아닌이 두 컬렉션 속성 만 유지하려고합니다.

실제로 내가 IPersistentCollection 개체를 추가하고 제거하고 부모 엔터티에 속하지 않고 자체를 나타 내기를 원한다. (엔터티의 컬렉션 속성에 발생하는 것과 동일한 것들, 부모 엔티티가없는 경우). 컬렉션이 엔티티에 속한 경우 완벽하게 잘 작동합니다.이 경우 두 세션간에 항목을 추가하거나 제거 할 수 있습니다.

도움을 주시면 감사하겠습니다.

+1

세션간에 작업해야한다는 요구 사항은 명확하지 않습니다. 불완전한 질문에 쓸모없는 답변을 사람들이 보내지 않도록하려면 질문에이 숨겨진 요구 사항을 추가해야합니다. –

답변

0

이 문제의 실제 해결책을 찾지 못했습니다. 지금까지는 하나의 인스턴스 만 존재하는 다른 엔터티에 컬렉션을 하위 컬렉션 속성으로 추가했습니다. 그러나이 엔티티의 인스턴스가 더 많아지면이 솔루션은 중단되며 아이템이 추가되거나 제거 될 때마다 버전이 증가된다는 단점이 있습니다.

다른 해결 방법은 등록 정보/열 (ID 제외)이없는 의사 엔티티를 작성하는 것이 었습니다.

내가 생각할 수있는 세 번째 대안은 매우 느리고 매번 다른 항목이 항목 중 하나를 참조하면 작동하지 않는 매회 전체 모음을 다시 만드는 것입니다.

마지막 대안은 직접 더티 검사 기능을 다시 구현하는 것이지만이 방법은 약간의 복잡성과 코드 중복을 추가 할 수 있습니다.

누군가가 더 나은 대안을 알고 있다면 나는 모든 의견에 기뻐할 것입니다.

0

의사 엔티티보다 간단한 솔루션은 원하는 것을 관리하는 개체에 목록을 래핑하는 것입니다.

public class FavoriteList : IEnumerable 
{ 
    private List<FavoriteItem> list; 
    private ISession session; 
    public FavoriteList(ISession session) 
    { 
    list = session.Linq<FavoriteItem>().ToList(); 
    this.session = session; 
    } 

    public void Add(FavoriteItem item) 
    { 
    session.SaveOrUpdate(item); 
    list.Add(item); 
    } 

    public void Remove(FavoriteItem item) 
    { 
    session.Delete(item); //or something like that 
    list.Remove(item); 
    } 

    public IEnumerator GetEnumerator() 
    { 
    return (list as IEnumerable).GetEnumerator(); 
    } 
} 
+0

로드 및 저장이 두 개의 다른 세션에서 발생하고 이러한 세션간에 추가 및 제거가 수행되는 경우에는 작동하지 않습니다. 실제로 내가 IPersistentCollection 개체를 추가하고 제거하는 부모 엔터티에 속하지 않으며 그 자신을 의미합니다 (내 엔티티가없는 경우 엔 엔티티의 컬렉션 속성에서 발생하는 것과 동일한 것들). 컬렉션이 엔티티에 속한 경우 완벽하게 잘 작동합니다.이 경우 두 세션간에 항목을 추가하거나 제거 할 수 있습니다. – Daniel