The API docs for the ISession.GetSession(EntityMode) function state:
==
Starts a new Session with the given entity mode in effect. This
secondary Session inherits the connection, transaction, and other
context information from the primary Session. It doesn't need to be
flushed or closed by the developer.
==

The current implementation doesn't always "start a new session" but
rather will only start a new session the first time you call
GetSession for a given entity mode. Subsequent calls to GetSession
with the same entity mode will return the same session that was
returned the first time.

example
==
var rootSession = OpenSession();
var childSession1 = rootSession.GetSession(EntityMode.Poco);
var childSession2 = rootSession.GetSession(EntityMode.Poco);
// childSession1 == childSession2
==

Currently, SessionImpl uses a Dictionary<EntityMode, ISession> to
track each new child session created. Given that session creation is
"cheap", is there any reason this couldn't be a List<ISession> and
always return a new Session?

The use-case where this came up for me was where I had multiple event
listeners registered that needed to save additional entities to the
database and each were using GetSession to "create" a child session.
If I disposed/closed the child session in the first event listener, I
would get a "session is closed" error when the second event listener
ran because GetSession would return the already closed/disposed
session from the first event listener. I understand there are
workarounds I can do (use the session factory to create a new session
or don't close/dispose the child session) to avoid the error but it
still seems the implementation is out of line with the documentation.

I'll be more than happy to open a JIRA ticket for this with a test
case but wanted to get some feedback here first.

Reply via email to