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. |