2012-11-29 2 views
1

2 차 레벨 캐시에 appfabric 1.1과 함께 NHibernate 3.2를 사용하고 있습니다. 동일한 테이블에 매핑 된 2 개의 클래스가 있습니다. 첫 번째 클래스 AFullEntity (샘플에서는 MonitorLayoutData)은 경량 클래스 인 두 번째 클래스 (MonitorLayout)를 상속합니다. MonitorLayoutData에는 기본 클래스에없는 무거운 속성이 포함되어 있습니다. 예를 들어 : NHibernate 2 차 레벨 캐시가 같은 테이블에있는 엔티티 맵을 무효화하지 않습니다.

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Entities.MonitorLayout,Entities" table="MonitorLayouts2" lazy="false" schema="dbo" polymorphism="explicit"> 
    <cache usage="nonstrict-read-write"/> 
    <id name="Id" column="MonitorLayout_ID" type="int"> 
     <generator class="native" /> 
    </id> 
    <property name="Name" column="MonitorLayout" type="string" /> 
    <property name="UserId" column="User_ID" type="int" /> 
    <property name="IsPublic" column="IsPublic" type="Boolean" not-null="true" /> 
    <property name="ViewGuid" column="ViewGuid" type="string" not-null="true" /> 
    <property name="TreeNode" column="TreeNode" type="string" /> 
    <property name="IncludeNodeChildren" column="IncludeNodeChildren" type="Boolean" /> 

    </class> 

    <class name="Entities.MonitorLayoutData,Entities" table="MonitorLayouts2" lazy="false" schema="dbo" polymorphism="explicit"> 
    <cache usage="nonstrict-read-write"/> 
    <id name="Id" column="MonitorLayout_ID" type="int"> 
     <generator class="native" /> 
    </id> 
    <property name="Name" column="MonitorLayout" type="string" /> 
    <property name="UserId" column="User_ID" type="int" /> 
    <property name="IsPublic" column="IsPublic" type="Boolean" not-null="true" /> 
    <property name="ViewGuid" column="ViewGuid" type="string" not-null="true" /> 
    <property name="TreeNode" column="TreeNode" type="string" /> 
    <property name="IncludeNodeChildren" column="IncludeNodeChildren" type="Boolean" /> 
    <property name="LayoutData" column="LayoutData" type="BinaryBlob" not-null="false"/> 
    </class> 
</hibernate-mapping> 

그 클래스

이 문서에 노트와 같은 선택한 유형 만 개체를 ​​검색하기 위해 명시 적 다형성을 사용 : "두 개의 다른 클래스들이 동일한 테이블로 매핑 될 때 Explicit 다형성이 유용하다 (이것은 허용" 테이블 열의 하위 집합을 포함하는 "가벼운"클래스).

엔티티가 캐싱되면 문제가 발생합니다. AFullEntity를 업데이트 할 때 변경 사항은 lightweight 클래스의 보고서가 아니며 이는 우리에게 큰 문제입니다. 하위 클래스 나 확장 같은 다른 메커니즘을 시도하지만 NHibernate는 나를 위해 필요하지 않은 discriminator 요소를 선언하도록 강요합니다.

이 방법이 있습니까?

+0

하위 분류 대신 [지연 속성] (http://ayende.com/blog/4377/nhibernate-new-feature-lazy-properties)을 보셨습니까? –

답변

0

아니요.이 두 개체는 각각 캐시에서 고유 한 ID를가집니다. 가능한 해결 방법은 가벼운 오브젝트에 대한 캐시를 사용 불가능하게하거나 대량 오브젝트가로드 될 때 캐시에서 가벼운 오브젝트를 축출하는 것입니다. 같은 세션에서 무거운 물건과 가벼운 물건을 적재하는 것은 나에게 목적을 이겨내는 것처럼 보인다.

+0

나는 이미 2 개의 분리 된 물체가 있다는 것을 알고있다. 나는 "연결된"물체를 무효화하려는 메카니즘을 찾고있다. 먼저 하위 클래스 인 mecanism을 사용하고자하지만 discriminator 없이는 사용할 수없는 것처럼 보입니다. 두 번째로 문제를 해결할 수있는 ILifecycle 인터페이스를 찾았습니다. 그러나 이것은 추악한 해결책입니다. EntityInterceptor가 세 번째 솔루션 일 수 있습니다. – Koektudis