From: <fab...@us...> - 2009-03-04 19:34:07
|
Revision: 4111 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4111&view=rev Author: fabiomaulo Date: 2009-03-04 19:34:04 +0000 (Wed, 04 Mar 2009) Log Message: ----------- User Example for NH-1685 Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/BinaryTimestamp.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomain.cs trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomainFixture.cs trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexVersioned.hbm.xml Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-04 18:47:03 UTC (rev 4110) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-04 19:34:04 UTC (rev 4111) @@ -1113,6 +1113,8 @@ <Compile Include="UtilityTest\TypeNameParserFixture.cs" /> <Compile Include="UtilityTest\WeakHashtableFixture.cs" /> <Compile Include="VersionTest\Db\MsSQL\BinaryTimestamp.cs" /> + <Compile Include="VersionTest\Db\MsSQL\ComplexDomain.cs" /> + <Compile Include="VersionTest\Db\MsSQL\ComplexDomainFixture.cs" /> <Compile Include="VersionTest\Db\MsSQL\GeneratedBinaryVersionFixture.cs" /> <Compile Include="VersionTest\Db\MsSQL\SimpleVersioned.cs" /> <Compile Include="VersionTest\Person.cs" /> @@ -1672,6 +1674,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="VersionTest\Db\MsSQL\ComplexVersioned.hbm.xml" /> <EmbeddedResource Include="Tools\hbm2ddl\SchemaExportTests\WithColumnTag.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1691\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1689\Mappings.hbm.xml" /> Modified: trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/BinaryTimestamp.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/BinaryTimestamp.cs 2009-03-04 18:47:03 UTC (rev 4110) +++ trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/BinaryTimestamp.cs 2009-03-04 19:34:04 UTC (rev 4111) @@ -73,21 +73,33 @@ { var xbytes = (byte[]) x; var ybytes = (byte[]) y; - if (xbytes.Length < ybytes.Length) + return CompareValues(xbytes, ybytes); + } + + bool IUserType.Equals(object x, object y) + { + return (x == y); + } + + #endregion + + private static int CompareValues(byte[] x, byte[] y) + { + if (x.Length < y.Length) { return -1; } - if (xbytes.Length > ybytes.Length) + if (x.Length > y.Length) { return 1; } - for (int i = 0; i < xbytes.Length; i++) + for (int i = 0; i < x.Length; i++) { - if (xbytes[i] < ybytes[i]) + if (x[i] < y[i]) { return -1; } - if (xbytes[i] > ybytes[i]) + if (x[i] > y[i]) { return 1; } @@ -95,11 +107,9 @@ return 0; } - bool IUserType.Equals(object x, object y) + public static bool Equals(byte[] x, byte[] y) { - return (x == y); + return CompareValues(x, y) == 0; } - - #endregion } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomain.cs 2009-03-04 19:34:04 UTC (rev 4111) @@ -0,0 +1,30 @@ +using Iesi.Collections.Generic; + +namespace NHibernate.Test.VersionTest.Db.MsSQL +{ + public class Bar + { + public virtual int Id { get; set; } + public virtual byte[] Timestamp { get; private set; } + public virtual int AField { get; set; } + public virtual Foo Foo { get; set; } + } + + public class Foo + { + public Foo() + { + Bars = new HashedSet<Bar>(); + } + public virtual int Id { get; set; } + public virtual byte[] Timestamp { get; private set; } + public virtual int AField { get; set; } + public virtual ISet<Bar> Bars { get; set; } + + public virtual void AddBar(Bar bar) + { + bar.Foo = this; + Bars.Add(bar); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomainFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomainFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexDomainFixture.cs 2009-03-04 19:34:04 UTC (rev 4111) @@ -0,0 +1,63 @@ +using System.Collections; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.VersionTest.Db.MsSQL +{ + [TestFixture] + public class ComplexDomainFixture : TestCase + { + protected override IList Mappings + { + get { return new[] { "VersionTest.Db.MsSQL.ComplexVersioned.hbm.xml" }; } + } + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + [Test] + public void NH1685() + { + using (ISession session = OpenSession()) + { + var bar = new Bar {AField = 24}; + + var foo = new Foo {AField = 42}; + foo.AddBar(bar); + + session.Save(foo); + session.Flush(); + session.Evict(bar); + session.Evict(foo); + + var retrievedBar = session.Get<Bar>(bar.Id); + + // At this point the assumption is that bar and retrievedBar should have + // identical values, but represent two different POCOs. The asserts below + // are intended to verify this. Currently this test fails on the comparison + // of the SQL Server timestamp (i.e. binary(8)) fields because + // NHibernate does not retrieve the new timestamp after the last update. + + Assert.AreNotSame(bar, retrievedBar); + Assert.AreEqual(bar.Id, retrievedBar.Id); + Assert.AreEqual(bar.AField, retrievedBar.AField); + Assert.AreEqual(bar.Foo.Id, retrievedBar.Foo.Id); + Assert.IsTrue(BinaryTimestamp.Equals(bar.Timestamp, retrievedBar.Timestamp), "Timestamps are different!"); + } + + using (ISession session = OpenSession()) + { + session.BeginTransaction(); + session.Delete("from Bar"); + session.Transaction.Commit(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexVersioned.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexVersioned.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/VersionTest/Db/MsSQL/ComplexVersioned.hbm.xml 2009-03-04 19:34:04 UTC (rev 4111) @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + default-cascade="save-update" + auto-import="true" + assembly="NHibernate.Test" + namespace="NHibernate.Test.VersionTest.Db.MsSQL"> + + <typedef name="ByteTimestamp" + class="NHibernate.Test.VersionTest.Db.MsSQL.BinaryTimestamp, NHibernate.Test"/> + + <class name="Bar" table="Bar" optimistic-lock="version"> + <id name="Id"> + <generator class="identity" /> + </id> + <version name="Timestamp" type="ByteTimestamp" generated="always" unsaved-value="null" access="backfield"> + <column name="LastModified" not-null="false" sql-type="timestamp"/> + </version> + <property name="AField"/> + <many-to-one name="Foo" column="FooID" cascade="all" class="Foo" not-null="true" /> + </class> + + <class name="Foo" table="Foo" optimistic-lock="version"> + <id name="Id"> + <generator class="identity" /> + </id> + <version name="Timestamp" type="ByteTimestamp" generated="always" unsaved-value="null" access="backfield"> + <column name="LastModified" not-null="false" sql-type="timestamp"/> + </version> + <property name="AField"/> + <set name="Bars" cascade="all" access="backfield" inverse="true"> + <key column="FooID" /> + <one-to-many class="Bar" /> + </set> + </class> +</hibernate-mapping> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |