From: NHibernate J. <mik...@us...> - 2006-12-15 11:54:33
|
[ http://jira.nhibernate.org/browse/NH-830?page=all ] Sergey Koshcheyev closed NH-830: -------------------------------- Resolution: Fixed > ICriteria does not automatically flush the session for many-to-many association change > -------------------------------------------------------------------------------------- > > Key: NH-830 > URL: http://jira.nhibernate.org/browse/NH-830 > Project: NHibernate > Type: Bug > Components: Core > Versions: 1.2.0.Beta2 > Reporter: Kailuo Wang > Fix For: 1.2.0.Beta3 > Attachments: SessFlush.zip > > It seems that, unlike IQuery, the ICriteria won't automatically flush the session for many-to-many association changes. > Note that these symptom only happens when the following 2 conditions are satisfied: > 1) the change is about a many-to-many association. It seems work fine with changes to one-to-many assocication > 2) the related entities are just reloaded from the database prior to the query. If the entities are just created and saved, the criteria will flush the session prior the query. > While you can also find the test case in the attachment, here is the code: > //Setup the test data > Cat mum = new Cat(); > Cat son = new Cat(); > sess.Save(mum); > sess.Save(son); > sess.Flush(); > //reload the data and then setup the many-to-many association > mum = sess.Get<Cat>(mum.Id); > son = sess.Get<Cat>(son.Id); > mum.Children.Add(son); > son.Parents.Add(mum); > sess.FlushMode = FlushMode.Auto; > //Use criteria API to search first > IList result = sess.CreateCriteria(typeof (Cat)) > .CreateAlias("Children", "child") > .Add(Expression.Eq("child.Id", son.Id)) > .List(); > //the criteria failed to find the mum cat with the child > Assert.AreEqual(0, result.Count); > > //then use HQL query to search > result = sess.CreateQuery("from Cat c where :son in elements c.Children ") > .SetEntity("son", son) > .List(); > //HQL query automatically flush the sess and thus find the change > Assert.AreEqual(1, result.Count); > //then use the same criteria to search again > result = sess.CreateCriteria(typeof(Cat)) > .CreateAlias("Children", "child") > .Add(Expression.Eq("child.Id", son.Id)) > .List(); > //find the result this time since the session was already flushed by the previous query > Assert.AreEqual(1, result.Count); > <?xml version="1.0" encoding="utf-8" ?> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo" assembly="NHSessTest" default-lazy="false"> > <class name="NHSessTest.Cat" > > <id name="Id" type="Int32" unsaved-value="0" > > <generator class="identity" /> > </id> > <set name="Children" lazy="true" table="ChildrenParents" > > <key column="Parent" /> > <many-to-many class="NHSessTest.Cat" column="Child" /> > </set> > <set name="Parents" lazy="true" inverse="true" table="ChildrenParents" > > <key column="Child" /> > <many-to-many class="NHSessTest.Cat" column="Parent" /> > </set> > </class> > </hibernate-mapping> > namespace NHSessTest > { > public class Cat > { > private int id; > private ISet children = new HashedSet(); > private ISet parents = new HashedSet(); > public int Id > { > get { return id; } > set { id = value; } > } > public ISet Children { > get { return children; } > set { children = value; } > } > public ISet Parents { > get { return parents; } > set { parents = value; } > } > } > } -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.nhibernate.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |