NHibernate에서 수식을 사용하여 계산 된 속성을 정의 할 때 쿼리 제한에 따라 수식의 결과가 달라지는 경우의 의미는 무엇입니까? 특히 쿼리 캐싱과 관련하여?NHibernate 캐싱에 대한 영향 계산 결과 값이 공식 (예 : rank)으로 매핑 된 결과 포함
public class Entity
{
public Entity() { }
public virtual int Id { get; protected set; }
public virtual string Key { get; protected set; }
public virtual string Value { get; protected set; }
public virtual int Rank { get; protected set; }
}
다음과 같은 간단한 NHibernate에 매핑과 매핑 :
은보다 구체적으로, 다음과 같은 간단한 C# 클래스 고려
<class name="Entity" mutable="false">
<id name="Id">
<generator class="native">
</id>
<property name="Key"/>
<property name="Value"/>
<property name="Rank" formula="row_number() over(order by value)">
</class>
true
로 설정 hibernate.cache.use_query_cache
옵션으로 세션 팩토리와 실행을하고, 쿼리 다음과 같은 방식으로 이루어집니다.
ICriteria criteria = session.CreateCriteria(typeof(Entity));
criteria.SetCacheable(true);
criteria.SetCacheRegion("SearchResults");
IList<Entity> queryResult1 = criteria.List<Entity>();
criteria = session.CreateCriteria(typeof(Entity));
criteria.SetCacheable(true);
criteria.SetCacheRegion("SearchResults");
criteria.Add(Restrictions.Like("Key", "a", MatchMode.Anywhere));
IList<Entity> queryResult2 = criteria.List<Entity>();
Entity directResult = session.Load<Entity>(id);
NHibernate는 반환 된 엔티티에 대해 합리적인 방식으로 동작합니까? 또는 한 캐시 된 쿼리의 "순위"값이 쿼리 캐시로 인해 다른 쿼리의 순위 값을 오염시킬 수 있습니까? NHibernate 매핑에서 그러한 수식을 사용할 때 다른 문제가 있습니까?
편집 :
그것은 또한 나의 특별한 경우에, "엔티티"는 일류 비즈니스 엔티티 아님을 주목할 필요가 있지만, 일종의 메타 개체 수 있습니다. 다른 일류 엔터티보다 인덱싱 된 데이터베이스 뷰에 매핑되며 검색 전용으로 사용됩니다 (session.Load (id) 호출은 인위적으로 이루어 지므로 실제로 실제로는 발생하지 않아야 함).
그리고 이 캐싱에 미치는 영향은 의심 스러울지라도 잠재적 인 문제를 피하기 위해 비슷한 사용 사례에 대해 어떤 대안이있을 수 있습니까?
질문에 대한 답변이 아니지만 NHibernate.Lucene을보고 싶을 수도 있습니다. 구현하기가 훨씬 쉬우 며 시도하는 방식으로 검색하는 데 훨씬 빠른 실행 시간을 제공합니다. – Paco
이 예제는 단지 설명의 목적이었습니다. 우리는 실제로 SQL Server의 전체 텍스트 검색을 사용하고 있으며 기능 또는 확장 성 제한이있는 경우 Lucene이 목록의 최상위에 있습니다. – iammichael
Rank 속성은 실제로 엔티티의 지속 값이 아닙니다. 실행 된 특정 쿼리에서 엔티티가 반환 된 결과입니다. IMHO 귀하의 도메인 클래스에 그것을 가지고있는 것이 옳지 않습니다. 또한 단일 세션 내에서 서로 "간섭"하거나 쿼리를 놓으면 서로를 "오염"시킬 수도 있습니다. –