From: Josef H. (JIRA) <nh...@gm...> - 2011-04-25 18:05:53
|
Nhibernate 2nd level cache and Result transformer ------------------------------------------------- Key: NH-2673 URL: http://216.121.112.228/browse/NH-2673 Project: NHibernate Issue Type: Bug Components: Core Affects Versions: 3.2.0Alpha2 Reporter: Josef Holan Priority: Blocker Attachments: Caching.zip I have a big problem with 2nd level cache in NHibernate. Everything is working fine(Cache is running well) until I use .SetResultTransformer(new DistinctRootEntityResultTransformer()) Example code: using (var session = SessionFactory.OpenSession()) { Console.WriteLine("---> using query first time"); var query = session .CreateQuery("from Blog b where b.Author = :author") .SetString("author", "Gabriel") .SetCacheable(true) .SetResultTransformer(new DistinctRootEntityResultTransformer()) ; var list = query.List<Blog>(); } Exception: NHibernate.PropertyAccessException: Exception occurred getter of Caching.Blog.Id v NHibernate.Properties.BasicPropertyAccessor.BasicGetter.Get(Object target) v d:\CSharp\NH\NH\nhibernate\src\NHibernate\Properties\BasicPropertyAccessor.cs: line 211 v NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetIdentifier(Object entity) v d:\CSharp\NH\NH\nhibernate\src\NHibernate\Tuple\Entity\AbstractEntityTuplizer.cs: line 139 v NHibernate.Persister.Entity.AbstractEntityPersister.GetIdentifier(Object obj, EntityMode entityMode) v d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs: line 3883 v NHibernate.Persister.Entity.AbstractEntityPersister.IsTransient(Object entity, ISessionImplementor session) v d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs: line 3669 v NHibernate.Engine.ForeignKeys.IsTransient(String entityName, Object entity, Nullable`1 assumed, ISessionImplementor session) v ForeignKeys.cs: line 194 v NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName, Object entity, ISessionImplementor session) v ForeignKeys.cs: line 250 v NHibernate.Type.ManyToOneType.Disassemble(Object value, ISessionImplementor session, Object owner) v ManyToOneType.cs: line 137 v NHibernate.Cache.StandardQueryCache.Put(QueryKey key, ICacheAssembler[] returnTypes, IList result, Boolean isNaturalKeyLookup, ISessionImplementor session) v StandardQueryCache.cs: line 82 v NHibernate.Loader.Loader.PutResultInQueryCache(ISessionImplementor session, QueryParameters queryParameters, IType[] resultTypes, IQueryCache queryCache, QueryKey key, IList result) v Loader.cs: line 1668 v NHibernate.Loader.Loader.ListUsingQueryCache(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) v Loader.cs: line 1617 v NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) v Loader.cs: line 1591 v NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) v QueryLoader.cs: line 300 v NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) v QueryTranslatorImpl.cs: line 111 v NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) v HQLQueryPlan.cs: line 105 v NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results) v SessionImpl.cs: line 616 v NHibernate.Impl.SessionImpl.List<T>(String query, QueryParameters parameters) v SessionImpl.cs: line 592 v NHibernate.Impl.QueryImpl.List<T>() v QueryImpl.cs: line 94 v UnitTests.when_having_blog_with_posts.trying_to_cache_a_complex_query() v Blog_Spec.cs: line 110 Mapping: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Caching" assembly="Caching"> <class name="Blog"> <cache usage="read-write"/> <id name="Id"> <generator class="hilo"/> </id> <property name="Author"/> <property name="Name"/> <set name="Posts" cascade="all" lazy="true"> <cache usage="read-write"/> <key column="BlogId"/> <one-to-many class="Post"/> </set> </class> <class name="Post"> <cache usage="read-write"/> <id name="Id"> <generator class="hilo"/> </id> <property name="Title"/> <property name="Body"/> </class> </hibernate-mapping> Classes: public class Blog { public virtual int Id { get; set; } public virtual string Author { get; set; } public virtual string Name { get; set; } public virtual ISet<Post> Posts { get; set; } public Blog() { Posts = new HashedSet<Post>(); } } public class Post { public virtual int Id { get; private set; } public virtual string Title { get; set; } public virtual string Body { get; set; } } nhibernate.config: <property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property> <property name="cache.use_second_level_cache">true</property> <property name="cache.use_query_cache" >true</property> In summary: Cache and nhibernate running well until i use result transformer. To work i must disable transformer or 2nd level cache. It is not working together This is only example, i know that distinct in this situation is stupid. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://216.121.112.228/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |