开发者

nHibernate does not throw exceptions when expected (invoking Save on entity in a collection)?

I am just getting started using nHibernate, and some behavior is a bit disturbing, which is it seemingly does not throw exceptions when you try to perform some action when you have either coded it oncorrectly, or have a configuration error.

For example, I have some code:

        ISessionFac开发者_如何学Gotory sessions = SessionManager.SessionFactory;
        ISession session = sessions.OpenSession();
        ITransaction tx1 = null;
        tx1 = session.BeginTransaction();
        IList<BusinessUnit> businessUnits = session.QueryOver<BusinessUnit>().List();
        System.Diagnostics.Debug.WriteLine("Count: " + businessUnits.Count);
        businessUnits[0].Name += "z";
        session.Save(businessUnits[0]);
        if (tx1 != null) tx1.Commit();
        session.Close();

When I first coded it, I did not include the usage of a transaction:

tx1 = session.BeginTransaction();  
if (tx1 != null) tx1.Commit();

So, apparently, if a transaction is not present, nHibernate doesn't (at least according to my configuration) automatically create one. Which is fine, I suppose.

But what bothers me is, if a transaction is required, and you try to perform a Save() without one, why doesn't it throw an exception?

(So far I have encountered another similar issue, I tried to load a collection, but apparently some error in my configuration prevented a successful load...so the code executes, but no exception indicating something has gone wrong).

Is there perhaps some config setting I am missing where exceptions are suppressed, or does a person have to unit test everything as no behavior can necessarily be assumed to work?


On a pre-existing object, a Save() is not automatically committed to the database, in the example above, it requires you to call:

Session.flush();

If one uses a transaction, then calling .Commit() on the transaction then invokes a flush().

So the reason no exception is thrown is because caching is default behavior by design (and if the programmer isn't aware of that then they will be very confused!!!)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜