2012-11-14 6 views
1

Nhibernate에서 2 차 캐시를 구현하는 데 문제가 있습니다. 나는 다음과 같은 클래스가 매핑이 있습니다2 차 레벨 캐시가있는 NHibernate가 Rehydrating 속성이 아닙니다. inserted = "false"update = "false"?

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" namespace="Data"> 
    <class name="Account" table="Accounts" lazy="false"> 
    <cache region="Standard" usage="read-write" include="all"/> 
    <id column="ID" name="ID"> 
     <generator class="assigned" /> 
    </id> 
    <version name="VersionStamp" column="VersionStamp" type="integer" unsaved-value="0" /> 
    <property name="Name" not-null="true" /> 
    <property name="Type" not-null="true" /> 
    <property name="ClientID" not-null="true" insert="false" update="false" /> 
    <property name="DateCreated" not-null="true" type="UtcDateTime" /> 
    <property name="LastUpdatedDate" not-null="true" type="UtcDateTime" /> 
    <property name="IsActive" not-null="true" /> 
    <many-to-one name="Client" class="Client" column="ClientID" not-found="exception" not-null="true" /> 
    </class> 
</hibernate-mapping> 

속성 "된 ClientID"는 클라이언트 테이블에 외래 키와 속성이 연결된 클라이언트 객체를 검색하는 데 사용 대일 클라이언트입니다.

새 계정을 추가 할 때 Session.Get을 사용하여 데이터베이스에서 Client 개체를 찾아 내 계정 개체의 Client 속성에 할당합니다. 또한 개체가 데이터베이스에 기록되고 ID가 데이터베이스에 올바르게 저장되면 ClientID 속성이 자동으로 채워집니다. Session.Get을 사용하여 ID로 데이터베이스에서 Account 개체를 검색하면 개체를 검색 할 때 모든 필드가 올바르게 채워집니다.

그러나 위에 표시된 설정을 사용하여 두 번째 수준의 캐시를 구현할 때 Account.Object를 사용하여 Account 개체를 검색 할 때 ClientID 속성이 채워지지 않지만 Client 속성은 올바르게 채워집니다. 이것이 2 차 레벨 캐시에서 작동하지 않는 몇 가지 이유가 있습니까? 아니면 내 매핑/구성에 잘못된 일을 했습니까?

현재 저는 캐싱 공급자로 SysCache만을 사용하고 있으며 쿼리와 두 번째 수준의 캐시가 모두 설정되어 있습니다. Client 클래스 매핑에는 Accounts에 상응하는 일대 다 속성이 포함됩니다.

Client 속성을 사용하지 않고 읽을 수 있도록 내 Account 클래스의 ClientID 속성을 편리하게 사용하기 때문에 캐싱없이 제대로 작동하는 것 같습니다.

도움 주셔서 감사합니다.

리치

답변

0

로컬 상황을 재현하려고했습니다. 위의 스 니펫과 동일하게 사용 된 매핑을 사용하여 UPDATE에서만 잘못된 동작을 수행 할 수있었습니다. 이 경우 ClientID이 캐시되었고 Client 참조가 변경된 동안 ClientID은 변경되지 않았습니다. 다른 경우 캐싱이 예상대로 작동하고있었습니다.

해결 방법은 매핑을 변경하는 것입니다. 아래 제안 된 매핑은 ClientID와 같은 읽기 전용 속성에 가장 적합합니다. (나는이 방법을 사용하고있다).

<property name="ClientID" formula="[ClientId]" 
     not-null="true" insert="false" update="false" /> 

그래서 트릭은 formula 매핑 대신 Column (없음이 제공되지 기본값)

+0

감사합니다, Radim입니다. 이것은 문제를 해결 한 것으로 보입니다. 나는 필드 이름을 둘러싼 []가 수식에 필요하다고 가정합니다. []를 모든 데이터베이스에 사용할 수 있습니까, 아니면 백엔드 데이터베이스를 변경하면 다른 수식을 지정해야합니까? –

+0

예, 다른 매핑이 필요합니다! ;) MS SQL Server에 연결할 때 사용하고 있습니다. 그러나 다른 DB 엔진에 손상을 줄 수 있는지 확실하지 않습니다. 그게 도움이 됐어! ;) –