|
From: <fab...@us...> - 2008-08-16 04:11:10
|
Revision: 3707
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3707&view=rev
Author: fabiomaulo
Date: 2008-08-16 04:11:17 +0000 (Sat, 16 Aug 2008)
Log Message:
-----------
- Port of <natural-id> from H3.2.6
- Bug fix in statistics
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs
trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs
trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs
trunk/nhibernate/src/NHibernate/Stat/StatisticsImpl.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/Naturalid/
trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/
trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/ImmutableNaturalIdFixture.cs
trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.cs
trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.hbm.xml
trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/
trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs
trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.cs
trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.hbm.xml
Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2008-08-15 21:41:48 UTC (rev 3706)
+++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -32,6 +32,13 @@
protected void PropertiesFromXML(XmlNode node, PersistentClass model)
{
+ PropertiesFromXML(node, model, null, true, true, false);
+ }
+
+ protected void PropertiesFromXML(XmlNode node, PersistentClass model, UniqueKey uniqueKey, bool mutable, bool nullable, bool naturalId)
+ {
+ string entityName = model.EntityName;
+
Table table = model.Table;
foreach (XmlNode subnode in node.ChildNodes)
@@ -47,8 +54,8 @@
CollectionBinder collectionBinder = new CollectionBinder(this);
if (collectionBinder.CanCreate(name))
{
- Mapping.Collection collection = collectionBinder.Create(name, subnode, model.EntityName,
- propertyName, model, model.MappedClass);
+ Mapping.Collection collection = collectionBinder.Create(name, subnode, entityName,
+ propertyName, model, model.MappedClass);
mappings.AddCollection(collection);
value = collection;
@@ -78,7 +85,7 @@
// NH: Modified from H2.1 to allow specifying the type explicitly using class attribute
System.Type reflectedClass = GetPropertyType(subnode, model.MappedClass, propertyName);
value = new Component(model);
- BindComponent(subnode, (Component) value, reflectedClass, model.EntityName, propertyName, true);
+ BindComponent(subnode, (Component)value, reflectedClass, entityName, propertyName, true);
}
else if ("join".Equals(name))
{
@@ -98,9 +105,34 @@
else if ("filter".Equals(name))
ParseFilter(subnode, model);
+ else if ("natural-id".Equals(name))
+ {
+ UniqueKey uk = new UniqueKey();
+ uk.Name = "_UniqueKey";
+ uk.Table = table;
+ //by default, natural-ids are "immutable" (constant)
+ bool mutableId = false;
+ if (subnode.Attributes["mutable"] != null)
+ {
+ mutableId = "true".Equals(subnode.Attributes["mutable"]);
+ }
+
+ PropertiesFromXML(subnode, model, uk, mutableId, false, true);
+ table.AddUniqueKey(uk);
+ }
+
if (value != null)
- model.AddProperty(CreateProperty(value, propertyName, model.MappedClass, subnode));
+ {
+ Property property = CreateProperty(value, propertyName, model.MappedClass, subnode);
+ if (!mutable)
+ property.IsUpdateable = false;
+ if (naturalId)
+ property.IsNaturalIdentifier = true;
+ model.AddProperty(property);
+ if (uniqueKey != null)
+ uniqueKey.AddColumns(new SafetyEnumerable<Column>(property.ColumnIterator));
+ }
}
}
Modified: trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs 2008-08-15 21:41:48 UTC (rev 3706)
+++ trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -727,5 +727,9 @@
return conj;
}
+ public static NaturalIdentifier NaturalId()
+ {
+ return new NaturalIdentifier();
+ }
}
}
Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2008-08-15 21:41:48 UTC (rev 3706)
+++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -81,9 +81,9 @@
CheckId(entity, persister, entry.Id, entityMode);
// grab its current state
- values = persister.GetPropertyValues(entity, session.EntityMode);
+ values = persister.GetPropertyValues(entity, entityMode);
- CheckNaturalId(persister, entry.Id, values, loadedState, session);
+ CheckNaturalId(persister, entry, values, loadedState, entityMode, session);
}
return values;
}
@@ -118,30 +118,29 @@
}
}
- private void CheckNaturalId(IEntityPersister persister, object identifier, object[] current, object[] loaded, ISessionImplementor session)
+ private void CheckNaturalId(IEntityPersister persister, EntityEntry entry, object[] current, object[] loaded, EntityMode entityMode, ISessionImplementor session)
{
- // TODO NH: Natural Identifier
- //if (persister.HasNaturalIdentifier)
- //{
- // if (loaded == null)
- // {
- // loaded = session.PersistenceContext.GetNaturalIdSnapshot(identifier, persister);
- // }
- // IType[] types = persister.PropertyTypes;
- // int[] props = persister.NaturalIdentifierProperties;
- // bool[] updateable = persister.PropertyUpdateability;
- // for (int i = 0; i < props.Length; i++)
- // {
- // int prop = props[i];
- // if (!updateable[prop])
- // {
- // if (!types[prop].Equals(current[prop], loaded[prop]))
- // {
- // throw new HibernateException("immutable natural identifier of an instance of " + persister.EntityName + " was altered");
- // }
- // }
- // }
- //}
+ if (persister.HasNaturalIdentifier && entry.Status != Status.ReadOnly)
+ {
+ if (loaded == null)
+ {
+ loaded = session.PersistenceContext.GetNaturalIdSnapshot(entry.Id, persister);
+ }
+ IType[] types = persister.PropertyTypes;
+ int[] props = persister.NaturalIdentifierProperties;
+ bool[] updateable = persister.PropertyUpdateability;
+ for (int i = 0; i < props.Length; i++)
+ {
+ int prop = props[i];
+ if (!updateable[prop])
+ {
+ if (!types[prop].IsEqual(current[prop], loaded[prop], entityMode))
+ {
+ throw new HibernateException("immutable natural identifier of an instance of " + persister.EntityName + " was altered");
+ }
+ }
+ }
+ }
}
private bool WrapCollections(IEventSource session, IEntityPersister persister, IType[] types, object[] values)
Modified: trunk/nhibernate/src/NHibernate/Stat/StatisticsImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Stat/StatisticsImpl.cs 2008-08-15 21:41:48 UTC (rev 3706)
+++ trunk/nhibernate/src/NHibernate/Stat/StatisticsImpl.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -657,7 +657,10 @@
qs.cacheHitCount++;
}
SecondLevelCacheStatistics slcs = GetSecondLevelCacheStatistics(regionName);
- slcs.hitCount++;
+ if (slcs != null)
+ {
+ slcs.hitCount++;
+ }
}
}
@@ -673,7 +676,10 @@
qs.cacheMissCount++;
}
SecondLevelCacheStatistics slcs = GetSecondLevelCacheStatistics(regionName);
- slcs.missCount++;
+ if (slcs != null)
+ {
+ slcs.missCount++;
+ }
}
}
@@ -689,7 +695,10 @@
qs.cachePutCount++;
}
SecondLevelCacheStatistics slcs = GetSecondLevelCacheStatistics(regionName);
- slcs.putCount++;
+ if (slcs != null)
+ {
+ slcs.putCount++;
+ }
}
}
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-08-15 21:41:48 UTC (rev 3706)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-08-16 04:11:17 UTC (rev 3707)
@@ -300,6 +300,10 @@
<Compile Include="MultipleCollectionFetchTest\MultipleSetFetchFixture.cs" />
<Compile Include="MultipleCollectionFetchTest\Person.cs" />
<Compile Include="MultiThreadRunner.cs" />
+ <Compile Include="Naturalid\Immutable\ImmutableNaturalIdFixture.cs" />
+ <Compile Include="Naturalid\Immutable\User.cs" />
+ <Compile Include="Naturalid\Mutable\MutableNaturalIdFixture.cs" />
+ <Compile Include="Naturalid\Mutable\User.cs" />
<Compile Include="NHAssert.cs" />
<Compile Include="NHibernateUtilTest.cs" />
<Compile Include="NHSpecificTest\AliasFixture.cs" />
@@ -1406,6 +1410,8 @@
<EmbeddedResource Include="CompositeId\Order.hbm.xml" />
<EmbeddedResource Include="CompositeId\Product.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="Naturalid\Immutable\User.hbm.xml" />
+ <EmbeddedResource Include="Naturalid\Mutable\User.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1419\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1413\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1304\Mappings.hbm.xml" />
Added: trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/ImmutableNaturalIdFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/ImmutableNaturalIdFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/ImmutableNaturalIdFixture.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -0,0 +1,144 @@
+using System.Collections;
+using NHibernate.Cfg;
+using NHibernate.Criterion;
+using NUnit.Framework;
+using NUnit.Framework.SyntaxHelpers;
+
+namespace NHibernate.Test.Naturalid.Immutable
+{
+ [TestFixture]
+ public class ImmutableNaturalIdFixture : TestCase
+ {
+ protected override string MappingsAssembly
+ {
+ get { return "NHibernate.Test"; }
+ }
+
+ protected override IList Mappings
+ {
+ get { return new string[] {"Naturalid.Immutable.User.hbm.xml"}; }
+ }
+
+ protected override void Configure(Configuration configuration)
+ {
+ cfg.SetProperty(Environment.UseSecondLevelCache, "true");
+ cfg.SetProperty(Environment.UseQueryCache, "true");
+ cfg.SetProperty(Environment.GenerateStatistics, "true");
+ }
+
+ [Test]
+ public void Update()
+ {
+ // prepare some test data...
+ User user;
+ using (ISession session = OpenSession())
+ {
+ session.BeginTransaction();
+ user = new User();
+ user.UserName = "steve";
+ user.Email = "st...@hi...";
+ user.Password = "brewhaha";
+ session.Save(user);
+ session.Transaction.Commit();
+ }
+ // 'user' is now a detached entity, so lets change a property and reattch...
+ user.Password = "homebrew";
+ using (ISession session = OpenSession())
+ {
+ session.BeginTransaction();
+ session.Update(user);
+ session.Transaction.Commit();
+ }
+
+ // clean up
+ using (ISession session = OpenSession())
+ {
+ session.BeginTransaction();
+ session.Delete(user);
+ session.Transaction.Commit();
+ }
+ }
+
+ [Test]
+ public void NaturalIdCheck()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+
+ User u = new User("steve", "superSecret");
+ s.Persist(u);
+ u.UserName = "Steve";
+ try
+ {
+ s.Flush();
+ Assert.Fail();
+ }
+ catch (HibernateException he) {}
+ u.UserName = "steve";
+ s.Delete(u);
+ t.Commit();
+ s.Close();
+ }
+
+ [Test]
+ public void NaturalIdCache()
+ {
+ ISession s = OpenSession();
+ s.BeginTransaction();
+ User u = new User("steve", "superSecret");
+ s.Persist(u);
+ s.Transaction.Commit();
+ s.Close();
+
+ sessions.Statistics.Clear();
+
+ s = OpenSession();
+ s.BeginTransaction();
+ u =
+ (User)
+ s.CreateCriteria(typeof (User)).Add(Restrictions.NaturalId().Set("UserName", "steve")).SetCacheable(true).
+ UniqueResult();
+ Assert.That(u, Is.Not.Null);
+ s.Transaction.Commit();
+ s.Close();
+
+ Assert.AreEqual(1, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount);
+ Assert.AreEqual(1, sessions.Statistics.QueryCachePutCount);
+
+ s = OpenSession();
+ s.BeginTransaction();
+ User v = new User("gavin", "supsup");
+ s.Persist(v);
+ s.Transaction.Commit();
+ s.Close();
+
+ sessions.Statistics.Clear();
+
+ s = OpenSession();
+ s.BeginTransaction();
+ u =
+ (User)
+ s.CreateCriteria(typeof(User)).Add(Restrictions.NaturalId().Set("UserName", "steve")).SetCacheable(true).
+ UniqueResult();
+ Assert.That(u, Is.Not.Null);
+ Assert.AreEqual(0, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount);
+ u =
+ (User)
+ s.CreateCriteria(typeof(User)).Add(Restrictions.NaturalId().Set("UserName", "steve")).SetCacheable(true).
+ UniqueResult();
+ Assert.That(u, Is.Not.Null);
+ Assert.AreEqual(0, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(2, sessions.Statistics.QueryCacheHitCount);
+ s.Transaction.Commit();
+ s.Close();
+
+ s = OpenSession();
+ s.BeginTransaction();
+ s.Delete("from User");
+ s.Transaction.Commit();
+ s.Close();
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -0,0 +1,48 @@
+namespace NHibernate.Test.Naturalid.Immutable
+{
+ public class User
+ {
+ private int myUserId;
+ private int version;
+ private string userName;
+ private string password;
+ private string email;
+ public User() {}
+
+ public User(string userName, string password)
+ {
+ this.userName = userName;
+ this.password = password;
+ }
+
+ public virtual int MyUserId
+ {
+ get { return myUserId; }
+ set { myUserId = value; }
+ }
+
+ public virtual int Version
+ {
+ get { return version; }
+ set { version = value; }
+ }
+
+ public virtual string UserName
+ {
+ get { return userName; }
+ set { userName = value; }
+ }
+
+ public virtual string Password
+ {
+ get { return password; }
+ set { password = value; }
+ }
+
+ public virtual string Email
+ {
+ get { return email; }
+ set { email = value; }
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Naturalid/Immutable/User.hbm.xml 2008-08-16 04:11:17 UTC (rev 3707)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!--
+
+ This mapping illustrates use of <natural-id mutable="false"/>
+
+-->
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ namespace="NHibernate.Test.Naturalid.Immutable"
+ assembly="NHibernate.Test">
+
+ <class name="User" table="IMM_NAT_ID_USER" lazy="true">
+ <comment>Users may bid for or sell auction items.</comment>
+ <id name="MyUserId" type="int">
+ <generator class="increment"/>
+ </id>
+ <natural-id mutable="false">
+ <property name="UserName" length="10"/>
+ </natural-id>
+ <version name="Version"/>
+ <property name="Password" not-null="true" length="15" column="`password`"/>
+ <property name="Email"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -0,0 +1,250 @@
+using System;
+using System.Collections;
+using System.Reflection;
+using NHibernate.Cfg;
+using NHibernate.Criterion;
+using NUnit.Framework;
+using NUnit.Framework.SyntaxHelpers;
+using Environment=NHibernate.Cfg.Environment;
+
+namespace NHibernate.Test.Naturalid.Mutable
+{
+ [TestFixture]
+ public class MutableNaturalIdFixture : TestCase
+ {
+ // TODO : Complete the test as H3.2.6
+ protected override string MappingsAssembly
+ {
+ get { return "NHibernate.Test"; }
+ }
+
+ protected override IList Mappings
+ {
+ get { return new string[] {"Naturalid.Mutable.User.hbm.xml"}; }
+ }
+
+ protected override void Configure(Configuration configuration)
+ {
+ cfg.SetProperty(Environment.UseSecondLevelCache, "true");
+ cfg.SetProperty(Environment.UseQueryCache, "true");
+ cfg.SetProperty(Environment.GenerateStatistics, "true");
+ }
+
+ [Test]
+ public void ReattachmentNaturalIdCheck()
+ {
+ ISession s = OpenSession();
+ s.BeginTransaction();
+ User u = new User("gavin", "hb", "secret");
+ s.Persist(u);
+ s.Transaction.Commit();
+ s.Close();
+
+ FieldInfo name = u.GetType().GetField("name",
+ BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
+ name.SetValue(u, "Gavin");
+ s = OpenSession();
+ s.BeginTransaction();
+ try
+ {
+ s.Update(u);
+ s.Transaction.Commit();
+ }
+ catch (HibernateException)
+ {
+ s.Transaction.Rollback();
+ }
+ catch (Exception)
+ {
+ try
+ {
+ s.Transaction.Rollback();
+ }
+ catch (Exception) {}
+ throw;
+ }
+ finally
+ {
+ s.Close();
+ }
+
+ s = OpenSession();
+ s.BeginTransaction();
+ s.Delete(u);
+ s.Transaction.Commit();
+ s.Close();
+ }
+
+ [Test]
+ public void NonexistentNaturalIdCache()
+ {
+ sessions.Statistics.Clear();
+
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+
+ object nullUser =
+ s.CreateCriteria(typeof (User))
+ .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb"))
+ .SetCacheable(true)
+ .UniqueResult();
+
+ Assert.That(nullUser, Is.Null);
+
+ t.Commit();
+ s.Close();
+
+ Assert.AreEqual(1, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount);
+ Assert.AreEqual(0, sessions.Statistics.QueryCachePutCount);
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ User u = new User("gavin", "hb", "secret");
+ s.Persist(u);
+
+ t.Commit();
+ s.Close();
+
+ sessions.Statistics.Clear();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ u =(User) s.CreateCriteria(typeof (User))
+ .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb"))
+ .SetCacheable(true).UniqueResult();
+
+ Assert.That(u, Is.Not.Null);
+
+ t.Commit();
+ s.Close();
+
+ Assert.AreEqual(1, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount);
+ Assert.AreEqual(1, sessions.Statistics.QueryCachePutCount);
+
+ sessions.Statistics.Clear();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ u =(User) s.CreateCriteria(typeof (User))
+ .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb"))
+ .SetCacheable(true).UniqueResult();
+
+ s.Delete(u);
+
+ t.Commit();
+ s.Close();
+
+ Assert.AreEqual(0, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount);
+
+ sessions.Statistics.Clear();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ nullUser = s.CreateCriteria(typeof (User))
+ .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb"))
+ .SetCacheable(true).UniqueResult();
+
+ Assert.That(nullUser, Is.Null);
+
+ t.Commit();
+ s.Close();
+
+ Assert.AreEqual(1, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount);
+ Assert.AreEqual(0, sessions.Statistics.QueryCachePutCount);
+ }
+
+ [Test]
+ public void NaturalIdCache()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+
+ User u = new User("gavin", "hb", "secret");
+ s.Persist(u);
+
+ t.Commit();
+ s.Close();
+
+ sessions.Statistics.Clear();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ u = (User) s.CreateCriteria(typeof (User))
+ .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb"))
+ .SetCacheable(true).UniqueResult();
+
+ Assert.That(u, Is.Not.Null);
+
+ t.Commit();
+ s.Close();
+
+ Assert.AreEqual(1, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount);
+ Assert.AreEqual(1, sessions.Statistics.QueryCachePutCount);
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ User v = new User("xam", "hb", "foobar");
+ s.Persist(v);
+
+ t.Commit();
+ s.Close();
+
+ sessions.Statistics.Clear();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ u = (User) s.CreateCriteria(typeof (User))
+ .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb"))
+ .SetCacheable(true).UniqueResult();
+
+ Assert.That(u, Is.Not.Null);
+
+ t.Commit();
+ s.Close();
+
+ Assert.AreEqual(0, sessions.Statistics.QueryExecutionCount);
+ Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount);
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ s.Delete("from User");
+ t.Commit();
+ s.Close();
+ }
+
+ [Test]
+ public void Querying()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+
+ User u = new User("emmanuel", "hb", "bh");
+ s.Persist(u);
+
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ u = (User) s.CreateQuery("from User u where u.name = :name").SetParameter("name", "emmanuel").UniqueResult();
+ Assert.AreEqual("emmanuel", u.Name);
+ s.Delete(u);
+
+ t.Commit();
+ s.Close();
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.cs 2008-08-16 04:11:17 UTC (rev 3707)
@@ -0,0 +1,34 @@
+namespace NHibernate.Test.Naturalid.Mutable
+{
+ public class User
+ {
+ private long id;
+ private readonly string name;
+ private readonly string org;
+ private string password;
+
+ public User() {}
+ public User(string name, string org, string password)
+ {
+ this.name = name;
+ this.org = org;
+ this.password = password;
+ }
+
+ public virtual string Name
+ {
+ get { return name; }
+ }
+
+ public virtual string Org
+ {
+ get { return org; }
+ }
+
+ public virtual string Password
+ {
+ get { return password; }
+ set { password = value; }
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/User.hbm.xml 2008-08-16 04:11:17 UTC (rev 3707)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!--
+
+ This mapping illustrates use of <natural-id mutable="true"/>
+
+-->
+
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ namespace="NHibernate.Test.Naturalid.Mutable"
+ assembly="NHibernate.Test"
+ default-access="field">
+
+ <class name="User" table="SystemUserInfo">
+ <id name="id">
+ <generator class="increment"/>
+ </id>
+ <natural-id mutable="true">
+ <property name="name"/>
+ <property name="org"/>
+ </natural-id>
+ <property name="password"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|