2012-10-05 3 views
0

저는 레거시 코드로 작업하고 있습니다. (가능한 한 조금 변경하고 싶습니다.) 많은 관계를 맺으려면 약간의 문제가 있습니다.Hibernate 부모를 삭제할 때 ManyToMany 레코드를 제거합니다.

public class Feature { 
    List<Profile> Profiles{get;set;} 
} 

public class Profile{ 
    List<FeatureProfile> Features{get;set;} 
} 

public class FeatureProfile { 
    Feature Feat {get;set;} 
    Profile Profile {get;set;} 
} 

과 매핑은 다음과 같이이다 :

여기에 내가 가진 무엇

mapper.Class<Feature>(m=> 
    m.Bag(x => x.Profiles, bagMap => 
        { 
         bagMap.Table("FeatureProfile"); 
         bagMap.Key(key=>key.Column("FeatureId")); 
         bagMap.Cascade(Cascade.All | Cascade.DeleteOrphans); 
        },map=>map.ManyToMany(manyToMany=>manyToMany.Column("ProfileId"))) 
); 


mapper.Class<Profile>(m=> 
    m.Bag(x => x.Features, bagMap => 
        { 
         bagMap.Key(key=>key.Column("ProfileId")); 
         bagMap.Inverse(true); 
         bagMap.Cascade(Cascade.All | Cascade.DeleteOrphans); 
        }) 
); 

mapper.Class<FeatureProfile>(m=> { 
    m.ManyToOne(x => x.Profile, x => x.Column("ProfileId")); 
    m.ManyToOne(x => x.Feat, x => x.Column("FeatureId")) 
}); 

내가해야 할 것은 : 나는 기능을 삭제하면 FeatureProfile의 너무로 삭제합니다. 나는 이것이 NHibernate 2.x에서 아마도 작용할 것이라고 생각한다.

답변

1

내 경험은 XML 매핑에 더 많은 것이지만, 나는 아래 행이 당신을 도울 수 있다고 말할 것이다. Hibernate는 m : n reletaions (위 예제에서와 같이 pair 테이블)에 대한 직접 매핑을 제공합니다. 객체 FeatureProfile을 완전히 제거 할 수 있습니다. 기능을 삭제하면 관계가 암시 적으로 매핑되며, 양 끝 (프로필 또는 기능)

<class name="Feature"...> 
... 
<bag name="Profiles" lazy="true" 
    table="FeatureProfile" cascade="none" > 
    <key column="FeatureId" /> 
    <many-to-many class="Profile" column="ProfileId" /> 
</bag> 
... 

<class name="Profile"...> 
... 
<bag name="Features" lazy="true" 
    table="FeatureProfile" cascade="none" > 
    <key column="ProfileId" /> 
    <many-to-many class="Feature" column="FeatureId" /> 
</bag> 
... 

그리고이 경우, NHibernate에 더 다른 방법이 없습니다 중 하나를 삭제할 때 같은이 적용됩니다, 다음, 페어 - 삭제하기 테이블 레코드뿐만 아니라 (DB 일관성을 유지할 수 없으며 /하지 말아야 함).

EDITED : 가방의 캐스케이드는이 경우에는 없어야합니다. 분리 고아가되면 정말 위험한 삭제가 발생합니다. 쌍뿐만 아니라 그 관계의 끝도. OP BY

편집은 : 여기에 우리가 코드에 의해 매핑을 사용하여 거라고 내용은 다음과 같습니다

mapper.Class<Profile>(m => 
{ 
    m.Bag(x => x.Features, bagMap => 
    { 
     bagMap.Table("FeatureProfile"); 
     bagMap.Key(key=>key.Column("ProfileId")); 
     bagMap.Lazy(CollectionLazy.Lazy) 
     bagMap.Inverse(false); 
     bagMap.Cascade(Cascade.None); 
    },map=>map.ManyToMany(manyToMany=>manyToMany.Column("FeatureId"))) 
} 

mapper.Class<Feature>(m => 
{ 
    m.Bag(x => x.Profiles, bagMap => 
    { 
     bagMap.Table("FeatureProfile"); 
     bagMap.Key(key=>key.Column("FeatureId")); 
     bagMap.Lazy(CollectionLazy.Lazy) 
     bagMap.Inverse(false); 
     bagMap.Cascade(Cascade.None); 
    },map=>map.ManyToMany(manyToMany=>manyToMany.Column("ProfileId"))) 
}); 
+0

답장을 보내 주셔서 감사하고, 답변을 너무 오래 걸려 죄송합니다, 나는 주말에 작업을 떠나기 전에이 권리를 기록했다. 정확하게 생성하려면 내 코드를 변경했지만 여전히 작동하지 않습니다. (다른 아이디어? – Tejo

+0

안녕하세요. 위의 솔루션을 다시 테스트했습니다. 실제로 버그가있었습니다 (지금 고정). 캐스케이드는 " none "으로 설정하면 pair 테이블에 영향을 미치지 않고 관계의 끝 부분에 영향을 미치지 않으므로이 유형의 매핑이 작동해야합니다. 단 하나의 끝이 제거되면 모든 쌍도 삭제됩니다. 너 –

+0

도와 주셔서 고마워요. 코드로 매핑하여 동일한 코드를 보여줄 수있는 대답을 바꿀 수 있습니까? – Tejo

관련 문제