Nobody has an idea?

To summarize with a small example:

I have a collection of Countries that are cached into the second level
cache
I have Managers that have a lazy reference to a Country
When I load a manager, I can read the manager.Country while the
session is open. But if I read it when the session is closed it gives
a lazy initialization exception.

This leads me to assume that the manager.Country is loaded with a
proxy even though the country is available from the second level
cache.

I will have a look at the code myself but if someone could point me in
the right direction I would greatly appreciate it.

Thanks,

Tolomaüs.

On 18 jun, 23:05, Tolomaüs <[email protected]> wrote:
> Hi,
>
> I'm in the middle of adding second level caching to an existing
> application and this is the first time that I really touch this -
> quite interesting - topic.
>
> Basically, what I want to do in this first phase is to pre-load all
> referential data (i.e. the slowly changing stuff) when the session
> factory is created, both the entities and the queries. This should
> allow me to mark all references to these entities as lazy in the
> mappings of the "dynamic" entities and, moreover, I shouldn't have to
> eagerly load them anymore in queries on these "dynamic" queries.
>
> So I hope to win both in performance and simplicity with this
> approach.
>
> But now I stumbled on a problem when a dynamic entity (Leaver) with a
> reference to a referential entity (Role) is loaded, then the session
> is closed and after that the referential entity is touched.
>
> This piece of code should make it more clear:
>
>             Leaver leaver;
>             using (IUnitOfWork unitOfWork = OpenUnitOfWork())
>             {
>                 LeaverRepository leaverRepository = new
> LeaverRepository(unitOfWork);
>                 leaver = leaverRepository.RetrieveLeaver
> (leaverFNumber);
>             }
>
>             Assert.IsTrue(NHibernateUtil.IsInitialized
> (leaver.Role)); // => FAILS!
>
> Here is what the logging shows:
> DefaultLoadEventListener:0 - loading entity: [Role#LHR]
> DefaultLoadEventListener:0 - creating new proxy for entity <<==
>
> So it seems that the second level cache is not checked when the Leaver
> is hydrated, resulting in a proxy. When the proxy is touched after the
> session is closed, the error occurs.
>
> As said, the reference Leaver.Role is lazy and the referential entity
> is sitting in the second level cache.
>
> If I load the Role from the second level cache into the session first,
> then there is no problem:
>
>             Leaver leaver;
>             using (IUnitOfWork unitOfWork = OpenUnitOfWork())
>             {
>                 RoleRepository roleRepository = new RoleRepository
> (unitOfWork);
>                 roleRepository.RetrieveAll();
>
>                 LeaverRepository leaverRepository = new
> LeaverRepository(unitOfWork);
>                 leaver = leaverRepository.RetrieveLeaver
> (leaverFNumber);
>             }
>
>             Assert.IsTrue(NHibernateUtil.IsInitialized
> (leaver.Role)); // => WORKS!
>
> Logs:
> DefaultLoadEventListener:0 - loading entity: [Role#LHR]
> DefaultLoadEventListener:0 - entity found in session cache  <<==
>
> Is this by design or did I discover a bug?
>
> Kind regards,
>
> Tolomaüs
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to