I've been poking around the second level cache code to make sure I
fully understand it, and I think I may have identified a potential bug
in the QueryKey class:

* QueryKey stores a list of PositionalParameters.  Normally this is
fine, but when you cache a query such as this:  "from User usr where
usr.Organization = ?" (where Organization is another entity), the
PositionalParameters collection contains the Organization entity
itself.
* If the second level cache you use is out-of-process (like
Memcached), the Organization entity NEEDS to be serializable AND
implement Equals and GetHashCode to make the cache work properly.
Personally, I don't like my entities to be serializable, and if you
don't implement Equals and GetHashCode the cache just grows
indefinitely for the same query without warning.

As far as I can tell, QueryKey should just hold the id of any entity
involved in the query.  I'd be more than happy to issue a patch, I
just haven't been able to figure out how to detect that an instance is
a persistent class or how to extract just it's identifier.  If someone
can point me in the right direction or tell me why I am wrong, I'd
appreciate it!

-tyler

Reply via email to