From: <fab...@us...> - 2009-02-08 13:37:29
|
Revision: 4072 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4072&view=rev Author: fabiomaulo Date: 2009-02-08 13:37:25 +0000 (Sun, 08 Feb 2009) Log Message: ----------- Reorganization of Tests about custom queries and StoredProcedure Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomSQLSupportTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomStoredProcSupportTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdEmployment.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLEmployment.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcs.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdEmployment.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/HandSQLTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLEmployment.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcs.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcsTest.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLTest.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-02-08 12:46:06 UTC (rev 4071) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-02-08 13:37:25 UTC (rev 4072) @@ -931,6 +931,8 @@ <Compile Include="ReflectionOptimizerTest\LcgFixture.cs" /> <Compile Include="SessionFactoryTest\Item.cs" /> <Compile Include="SessionFactoryTest\SessionFactorySerializationFixture.cs" /> + <Compile Include="SqlTest\Custom\CustomSQLSupportTest.cs" /> + <Compile Include="SqlTest\Custom\CustomStoredProcSupportTest.cs" /> <Compile Include="Tools\hbm2ddl\SchemaUpdate\MigrationFixture.cs" /> <Compile Include="Tools\hbm2ddl\SchemaUpdate\Version.cs" /> <Compile Include="SecondLevelCacheTest\AnotherItem.cs" /> @@ -950,15 +952,14 @@ <Compile Include="SqlCommandTest\TemplateFixture.cs" /> <Compile Include="SqlTest\Dimension.cs" /> <Compile Include="SqlTest\Employment.cs" /> - <Compile Include="SqlTest\FireBirdTest.cs" /> + <Compile Include="SqlTest\Custom\Firebird\FireBirdTest.cs" /> <Compile Include="SqlTest\Query\NativeSQLQueriesFixture.cs" /> - <Compile Include="SqlTest\HandSQLTest.cs" /> - <Compile Include="SqlTest\IdentityInsertWithStoredProcsTest.cs" /> + <Compile Include="SqlTest\Identity\IdentityInsertWithStoredProcsTest.cs" /> <Compile Include="SqlTest\Query\Item.cs" /> <Compile Include="SqlTest\MonetaryAmount.cs" /> <Compile Include="SqlTest\MonetaryAmountUserType.cs" /> - <Compile Include="SqlTest\MSSQLIdentityInsertWithStoredProcsTest.cs" /> - <Compile Include="SqlTest\MSSQLTest.cs" /> + <Compile Include="SqlTest\Identity\MsSQL\MSSQLIdentityInsertWithStoredProcsTest.cs" /> + <Compile Include="SqlTest\Custom\MsSQL\MSSQLTest.cs" /> <Compile Include="SqlTest\NullDateUserType.cs" /> <Compile Include="SqlTest\Order.cs" /> <Compile Include="SqlTest\Organization.cs" /> @@ -1252,7 +1253,7 @@ <EmbeddedResource Include="FilterTest\FilterMapping.hbm.xml" /> </ItemGroup> <ItemGroup> - <EmbeddedResource Include="SqlTest\MSSQLEmployment.hbm.xml" /> + <EmbeddedResource Include="SqlTest\Custom\MsSQL\MSSQLEmployment.hbm.xml" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="SqlTest\Query\NativeSQLQueries.hbm.xml" /> @@ -1301,7 +1302,7 @@ <EmbeddedResource Include="NHSpecificTest\NH606\Mapping.hbm.xml" /> </ItemGroup> <ItemGroup> - <EmbeddedResource Include="SqlTest\FireBirdEmployment.hbm.xml" /> + <EmbeddedResource Include="SqlTest\Custom\Firebird\FireBirdEmployment.hbm.xml" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="NHSpecificTest\NH732\Mappings.hbm.xml" /> @@ -1725,7 +1726,7 @@ <EmbeddedResource Include="EntityModeTest\Xml\Basic\AB.hbm.xml" /> <EmbeddedResource Include="EntityModeTest\Xml\Basic\Account.hbm.xml" /> <EmbeddedResource Include="EntityModeTest\Xml\Basic\Employer.hbm.xml" /> - <EmbeddedResource Include="SqlTest\MSSQLIdentityInsertWithStoredProcs.hbm.xml" /> + <EmbeddedResource Include="SqlTest\Identity\MsSQL\MSSQLIdentityInsertWithStoredProcs.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1508\Mappings.hbm.xml" /> <EmbeddedResource Include="GenericTest\OrderedSetGeneric\OrderedSetFixture.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1293\Mappings.hbm.xml" /> @@ -1770,7 +1771,7 @@ </ItemGroup> <ItemGroup> <Folder Include="Properties\" /> - <Folder Include="SqlTest\Custom\" /> + <Folder Include="SqlTest\Custom\Oracle\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomSQLSupportTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomSQLSupportTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomSQLSupportTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,85 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest.Custom +{ + public abstract class CustomSQLSupportTest: TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected static object GetFirstItem(IEnumerable it) + { + IEnumerator en = it.GetEnumerator(); + return en.MoveNext() ? en.Current : null; + } + + [Test] + public void HandSQL() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + Organization ifa = new Organization("IFA"); + Organization jboss = new Organization("JBoss"); + Person gavin = new Person("Gavin"); + Employment emp = new Employment(gavin, jboss, "AU"); + object orgId = s.Save(jboss); + s.Save(ifa); + s.Save(gavin); + s.Save(emp); + t.Commit(); + + t = s.BeginTransaction(); + Person christian = new Person("Christian"); + s.Save(christian); + Employment emp2 = new Employment(christian, jboss, "EU"); + s.Save(emp2); + t.Commit(); + s.Close(); + + sessions.Evict(typeof(Organization)); + sessions.Evict(typeof(Person)); + sessions.Evict(typeof(Employment)); + + s = OpenSession(); + t = s.BeginTransaction(); + jboss = (Organization)s.Get(typeof(Organization), orgId); + Assert.AreEqual(jboss.Employments.Count, 2); + emp = (Employment)GetFirstItem(jboss.Employments); + gavin = emp.Employee; + Assert.AreEqual(gavin.Name, "GAVIN"); + Assert.AreEqual(s.GetCurrentLockMode(gavin), LockMode.Upgrade); + emp.EndDate = DateTime.Today; + Employment emp3 = new Employment(gavin, jboss, "US"); + s.Save(emp3); + t.Commit(); + s.Close(); + + s = OpenSession(); + t = s.BeginTransaction(); + IEnumerator iter = s.GetNamedQuery("allOrganizationsWithEmployees").List().GetEnumerator(); + Assert.IsTrue(iter.MoveNext()); + Organization o = (Organization)iter.Current; + Assert.AreEqual(o.Employments.Count, 3); + + foreach (Employment e in o.Employments) + { + s.Delete(e); + } + + foreach (Employment e in o.Employments) + { + s.Delete(e.Employee); + } + s.Delete(o); + Assert.IsFalse(iter.MoveNext()); + s.Delete(ifa); + t.Commit(); + s.Close(); + } + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomStoredProcSupportTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomStoredProcSupportTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/CustomStoredProcSupportTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,73 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest.Custom +{ + public abstract class CustomStoredProcSupportTest : CustomSQLSupportTest + { + [Test] + public void ScalarStoredProcedure() + { + ISession s = OpenSession(); + IQuery namedQuery = s.GetNamedQuery("simpleScalar"); + namedQuery.SetInt64("number", 43L); + IList list = namedQuery.List(); + object[] o = (object[])list[0]; + Assert.AreEqual(o[0], "getAll"); + Assert.AreEqual(o[1], 43L); + s.Close(); + } + + [Test] + public void ParameterHandling() + { + ISession s = OpenSession(); + + IQuery namedQuery = s.GetNamedQuery("paramhandling"); + namedQuery.SetInt64(0, 10L); + namedQuery.SetInt64(1, 20L); + IList list = namedQuery.List(); + object[] o = (Object[])list[0]; + Assert.AreEqual(o[0], 10L); + Assert.AreEqual(o[1], 20L); + + namedQuery = s.GetNamedQuery("paramhandling_mixed"); + namedQuery.SetInt64(0, 10L); + namedQuery.SetInt64("second", 20L); + list = namedQuery.List(); + o = (object[])list[0]; + Assert.AreEqual(o[0], 10L); + Assert.AreEqual(o[1], 20L); + s.Close(); + } + + [Test] + public void EntityStoredProcedure() + { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + + Organization ifa = new Organization("IFA"); + Organization jboss = new Organization("JBoss"); + Person gavin = new Person("Gavin"); + Employment emp = new Employment(gavin, jboss, "AU"); + s.Save(ifa); + s.Save(jboss); + s.Save(gavin); + s.Save(emp); + + IQuery namedQuery = s.GetNamedQuery("selectAllEmployments"); + IList list = namedQuery.List(); + Assert.IsTrue(list[0] is Employment); + s.Delete(emp); + s.Delete(ifa); + s.Delete(jboss); + s.Delete(gavin); + + t.Commit(); + s.Close(); + } + + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdEmployment.hbm.xml (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdEmployment.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdEmployment.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdEmployment.hbm.xml 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,235 @@ +<?xml version="1.0"?> +<!-- + + This mapping demonstrates the use of Hibernate with + all-handwritten SQL! + + This version is for Firebird +--> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.SqlTest" + default-access="field.camelcase"> + + <class name="Organization" table="ORGANIZATION"> + <id name="Id" unsaved-value="0" column="ORGID"> + <generator class="increment"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <set name="Employments" + inverse="true" + order-by="DUMMY"> + <key column="EMPLOYER"/> + <!-- only needed for DDL generation --> + <one-to-many class="Employment"/> + <loader query-ref="organizationEmployments"/> + </set> + <!-- query-list name="currentEmployments" + query-ref="organizationCurrentEmployments"--> + <loader query-ref="organization"/> + <sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert> + <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update> + <sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete> + </class> + + <class name="Person" table="PERSON"> + <id name="Id" unsaved-value="0" column="PERID"> + <generator class="increment"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <loader query-ref="person"/> + <sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert> + <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> + <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> + </class> + + <class name="Employment" table="EMPLOYMENT"> + <id name="employmentId" unsaved-value="0" column="EMPID"> + <generator class="increment"/> + </id> + <many-to-one name="Employee" column="EMPLOYEE" not-null="true" update="false"/> + <many-to-one name="Employer" column="EMPLOYER" not-null="true" update="false"/> + <property name="StartDate" column="STARTDATE" not-null="true" update="false" insert="false"/> + <property name="EndDate" column="ENDDATE" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test"/> + <property name="RegionCode" column="REGIONCODE" update="false"/> + <property name="Salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test"> + <column name="AVALUE" sql-type="float"/> + <column name="CURRENCY"/> + </property> + <loader query-ref="employment"/> + <sql-insert> + INSERT INTO EMPLOYMENT + (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, AVALUE, CURRENCY, EMPID) + VALUES (?, ?, 'NOW', UPPER(?), ?, ?, ?) + </sql-insert> + <sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, AVALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> + <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> + </class> + + <resultset name="org-emp-regionCode"> + <return-scalar column="regionCode" type="string"/> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + </resultset> + + <resultset name="org-emp-person"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + <return-join alias="pers" property="emp.Employee"/> + </resultset> + + <sql-query name="person"> + <return alias="p" class="Person" lock-mode="upgrade"/> + SELECT NAME AS {p.Name}, PERID AS {p.Id} FROM PERSON WHERE PERID=? FOR UPDATE + </sql-query> + + <sql-query name="organization"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + SELECT {org.*}, {emp.*} + FROM ORGANIZATION org + LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER + WHERE org.ORGID=? + </sql-query> + + + <!--sql-query name="organization"> + <return alias="org" class="Organization"/> + SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION + WHERE ORGID=? + </sql-query--> + + <sql-query name="allOrganizationsWithEmployees"> + <!-- TODO H3: add flush-mode="never" --> + <return alias="org" class="Organization"/> + SELECT DISTINCT org.NAME AS {org.Name}, org.ORGID AS {org.Id} + FROM ORGANIZATION org + INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID + </sql-query> + + <sql-query name="employment"> + <return alias="emp" class="Employment"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id} + FROM EMPLOYMENT + WHERE EMPID = ? + </sql-query> + + <sql-query name="organizationEmployments"> + <load-collection alias="empcol" role="Organization.Employments"/> + SELECT {empcol.*} + FROM EMPLOYMENT empcol + WHERE EMPLOYER = :id + ORDER BY STARTDATE ASC, EMPLOYEE ASC + </sql-query> + + + <sql-query name="organizationCurrentEmployments"> + <return alias="emp" class="Employment"> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="AVALUE"/> + <return-column name="CURRENCY"/> + </return-property> + <!-- Here we are remapping endDate. Notice that we can still use {emp.EndDate} in the SQL. --> + <return-property name="EndDate" column="myEndDate"/> + </return> + <synchronize table="EMPLOYMENT"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id}, AVALUE, CURRENCY + FROM EMPLOYMENT + WHERE EMPLOYER = :id AND ENDDATE IS NULL + ORDER BY STARTDATE ASC + </sql-query> + + <sql-query name="simpleScalar"> + <return-scalar column="name" type="string"/> + <return-scalar column="value1" type="long"/> + SELECT * FROM simpleScalar(:number) + </sql-query> + + <sql-query name="paramhandling"> + <return-scalar column="value1" type="long"/> + <return-scalar column="value2" type="long"/> + SELECT * FROM paramHandling( ?, ?) + </sql-query> + + <sql-query name="paramhandling_mixed"> + <return-scalar column="value1" type="long" /> + <return-scalar column="value2" type="long" /> + SELECT * FROM paramHandling( ?, :second) + </sql-query> + + <sql-query name="selectAllEmployments"> + <return class="Employment"> + <return-property name="Employee" column="EMPLOYEE"/> + <return-property name="Employer" column="EMPLOYER"/> + <return-property name="StartDate" column="STARTDATE"/> + <return-property name="EndDate" column="ENDDATE"/> + <return-property name="RegionCode" column="REGIONCODE"/> + <return-property name="id" column="EMPID"/> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="AVALUE"/> + <return-column name="CURRENCY"/> + </return-property> + </return> + SELECT * FROM selectAllEmployments + </sql-query> + + <database-object> + <create> +CREATE PROCEDURE selectAllEmployments +RETURNS(EMPLOYEE BIGINT, EMPLOYER BIGINT, STARTDATE TIMESTAMP, ENDDATE DATE, +REGIONCODE VARCHAR(255) CHARACTER SET WIN1252, EMPID BIGINT, AVALUE FLOAT, +CURRENCY VARCHAR(3) CHARACTER SET WIN1252) +AS +BEGIN +FOR SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, REGIONCODE, EMPID, AVALUE, CURRENCY FROM EMPLOYMENT +INTO :EMPLOYEE, :EMPLOYER, :STARTDATE, :ENDDATE, :REGIONCODE, :EMPID, :AVALUE, :CURRENCY DO +SUSPEND; +END; + </create> + <drop> + DROP PROCEDURE selectAllEmployments + </drop> + </database-object> + + <database-object> + <create> +CREATE PROCEDURE paramHandling(J INTEGER, I INTEGER) +RETURNS(VALUE1 INTEGER, VALUE2 INTEGER) +AS +BEGIN +VALUE1 = :J; +VALUE2 = :I; +SUSPEND; +END; + </create> + <drop> + DROP PROCEDURE paramHandling + </drop> + </database-object> + + <database-object> + <create> +CREATE PROCEDURE simpleScalar(ANUMBER INTEGER) +RETURNS(VALUE1 INTEGER, NAME VARCHAR(10) CHARACTER SET UNICODE_FSS) +AS +BEGIN +VALUE1 = :ANUMBER; +NAME = 'getAll'; +SUSPEND; +END; + </create> + <drop> + DROP PROCEDURE simpleScalar + </drop> + </database-object> + +</hibernate-mapping> Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdEmployment.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdTest.cs (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdTest.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,20 @@ +using System.Collections; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest.Custom.Firebird +{ + [TestFixture] + public class FireBirdTest : CustomStoredProcSupportTest + { + protected override IList Mappings + { + get { return new[] {"SqlTest.Custom.Firebird.FireBirdEmployment.hbm.xml"}; } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is FirebirdDialect; + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Firebird/FireBirdTest.cs ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLEmployment.hbm.xml (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLEmployment.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLEmployment.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLEmployment.hbm.xml 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,221 @@ +<?xml version="1.0"?> +<!-- + + This mapping demonstrates the use of Hibernate with + all-handwritten SQL! + + This version is for Sybase/mssql +--> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.SqlTest" + default-access="field.camelcase"> + + <class name="Organization" table="ORGANIZATION"> + <id name="Id" unsaved-value="0" column="ORGID"> + <generator class="increment"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <set name="Employments" + inverse="true" + order-by="DUMMY"> + <key column="EMPLOYER"/> + <!-- only needed for DDL generation --> + <one-to-many class="Employment"/> + <loader query-ref="organizationEmployments"/> + </set> + <!-- query-list name="currentEmployments" + query-ref="organizationCurrentEmployments"--> + <loader query-ref="organization"/> + <sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert> + <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update> + <sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete> + </class> + + <class name="Person" table="PERSON"> + <id name="Id" unsaved-value="0" column="PERID"> + <generator class="increment"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <loader query-ref="person"/> + <sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert> + <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> + <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> + </class> + + <class name="Employment" table="EMPLOYMENT"> + <id name="employmentId" unsaved-value="0" column="EMPID"> + <generator class="increment"/> + </id> + <many-to-one name="Employee" column="EMPLOYEE" not-null="true" update="false"/> + <many-to-one name="Employer" column="EMPLOYER" not-null="true" update="false"/> + <property name="StartDate" column="STARTDATE" not-null="true" update="false" insert="false"/> + <property name="EndDate" column="ENDDATE" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test"/> + <property name="RegionCode" column="REGIONCODE" update="false"/> + <property name="Salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test"> + <column name="VALUE" sql-type="float"/> + <column name="CURRENCY"/> + </property> + <loader query-ref="employment"/> + <sql-insert> + INSERT INTO EMPLOYMENT + (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) + VALUES (?, ?, getdate(), UPPER(?), ?, ?, ?) + </sql-insert> + <sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> + <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> + </class> + + <resultset name="org-emp-regionCode"> + <return-scalar column="regionCode" type="string"/> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + </resultset> + + <resultset name="org-emp-person"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + <return-join alias="pers" property="emp.Employee"/> + </resultset> + + <sql-query name="person"> + <return alias="p" class="Person" lock-mode="upgrade"/> + SELECT NAME AS {p.Name}, PERID AS {p.Id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/ + </sql-query> + + <sql-query name="organization"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + SELECT {org.*}, {emp.*} + FROM ORGANIZATION org + LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER + WHERE org.ORGID=? + </sql-query> + + + <!--sql-query name="organization"> + <return alias="org" class="Organization"/> + SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION + WHERE ORGID=? + </sql-query--> + + <sql-query name="allOrganizationsWithEmployees"> + <!-- TODO H3: add flush-mode="never" --> + <return alias="org" class="Organization"/> + SELECT DISTINCT org.NAME AS {org.Name}, org.ORGID AS {org.Id} + FROM ORGANIZATION org + INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID + </sql-query> + + + + + + <sql-query name="employment"> + <return alias="emp" class="Employment"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.employmentId} + FROM EMPLOYMENT + WHERE EMPID = ? + </sql-query> + + <sql-query name="organizationEmployments"> + <load-collection alias="empcol" role="Organization.Employments"/> + SELECT {empcol.*} + FROM EMPLOYMENT empcol + WHERE EMPLOYER = :id + ORDER BY STARTDATE ASC, EMPLOYEE ASC + </sql-query> + + + <sql-query name="organizationCurrentEmployments"> + <return alias="emp" class="Employment"> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + <!-- Here we are remapping endDate. Notice that we can still use {emp.EndDate} in the SQL. --> + <return-property name="EndDate" column="myEndDate"/> + </return> + <synchronize table="EMPLOYMENT"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.employmentId}, VALUE, CURRENCY + FROM EMPLOYMENT + WHERE EMPLOYER = :id AND ENDDATE IS NULL + ORDER BY STARTDATE ASC + </sql-query> + + <sql-query name="simpleScalar"> + <return-scalar column="name" type="string"/> + <return-scalar column="value" type="long"/> + exec simpleScalar :number + </sql-query> + + <sql-query name="paramhandling"> + <return-scalar column="value" type="long"/> + <return-scalar column="value2" type="long"/> + exec paramHandling ?, ? + </sql-query> + + <sql-query name="paramhandling_mixed"> + <return-scalar column="value" type="long" /> + <return-scalar column="value2" type="long" /> + exec paramHandling ?, :second + </sql-query> + + <sql-query name="selectAllEmployments"> + <return class="Employment"> + <return-property name="Employee" column="EMPLOYEE"/> + <return-property name="Employer" column="EMPLOYER"/> + <return-property name="StartDate" column="STARTDATE"/> + <return-property name="EndDate" column="ENDDATE"/> + <return-property name="RegionCode" column="REGIONCODE"/> + <return-property name="id" column="EMPID"/> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + </return> + exec selectAllEmployments + </sql-query> + + <database-object> + <create> + CREATE PROCEDURE selectAllEmployments AS + SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, + REGIONCODE, EMPID, VALUE, CURRENCY + FROM EMPLOYMENT + </create> + <drop> + DROP PROCEDURE selectAllEmployments + </drop> + </database-object> + + <database-object> + <create> + CREATE PROCEDURE paramHandling @j int, @i int AS + SELECT @j as value, @i as value2 + </create> + <drop> + DROP PROCEDURE paramHandling + </drop> + </database-object> + + <database-object> + <create> + CREATE PROCEDURE simpleScalar @number int AS + SELECT @number as value, 'getAll' as name + </create> + <drop> + DROP PROCEDURE simpleScalar + </drop> + </database-object> + +</hibernate-mapping> Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLEmployment.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLTest.cs (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLTest.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,20 @@ +using System.Collections; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest.Custom.MsSQL +{ + [TestFixture] + public class MSSQLTest : CustomStoredProcSupportTest + { + protected override IList Mappings + { + get { return new[] { "SqlTest.Custom.MsSQL.MSSQLEmployment.hbm.xml" }; } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/MsSQL/MSSQLTest.cs ___________________________________________________________________ Added: svn:mergeinfo + Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdEmployment.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdEmployment.hbm.xml 2009-02-08 12:46:06 UTC (rev 4071) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdEmployment.hbm.xml 2009-02-08 13:37:25 UTC (rev 4072) @@ -1,235 +0,0 @@ -<?xml version="1.0"?> -<!-- - - This mapping demonstrates the use of Hibernate with - all-handwritten SQL! - - This version is for Firebird ---> -<hibernate-mapping - xmlns="urn:nhibernate-mapping-2.2" - assembly="NHibernate.Test" - namespace="NHibernate.Test.SqlTest" - default-access="field.camelcase"> - - <class name="Organization" table="ORGANIZATION"> - <id name="Id" unsaved-value="0" column="ORGID"> - <generator class="increment"/> - </id> - <property name="Name" not-null="true" column="NAME"/> - <set name="Employments" - inverse="true" - order-by="DUMMY"> - <key column="EMPLOYER"/> - <!-- only needed for DDL generation --> - <one-to-many class="Employment"/> - <loader query-ref="organizationEmployments"/> - </set> - <!-- query-list name="currentEmployments" - query-ref="organizationCurrentEmployments"--> - <loader query-ref="organization"/> - <sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert> - <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update> - <sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete> - </class> - - <class name="Person" table="PERSON"> - <id name="Id" unsaved-value="0" column="PERID"> - <generator class="increment"/> - </id> - <property name="Name" not-null="true" column="NAME"/> - <loader query-ref="person"/> - <sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert> - <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> - <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> - </class> - - <class name="Employment" table="EMPLOYMENT"> - <id name="employmentId" unsaved-value="0" column="EMPID"> - <generator class="increment"/> - </id> - <many-to-one name="Employee" column="EMPLOYEE" not-null="true" update="false"/> - <many-to-one name="Employer" column="EMPLOYER" not-null="true" update="false"/> - <property name="StartDate" column="STARTDATE" not-null="true" update="false" insert="false"/> - <property name="EndDate" column="ENDDATE" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test"/> - <property name="RegionCode" column="REGIONCODE" update="false"/> - <property name="Salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test"> - <column name="AVALUE" sql-type="float"/> - <column name="CURRENCY"/> - </property> - <loader query-ref="employment"/> - <sql-insert> - INSERT INTO EMPLOYMENT - (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, AVALUE, CURRENCY, EMPID) - VALUES (?, ?, 'NOW', UPPER(?), ?, ?, ?) - </sql-insert> - <sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, AVALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> - <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> - </class> - - <resultset name="org-emp-regionCode"> - <return-scalar column="regionCode" type="string"/> - <return alias="org" class="Organization"/> - <return-join alias="emp" property="org.Employments"/> - </resultset> - - <resultset name="org-emp-person"> - <return alias="org" class="Organization"/> - <return-join alias="emp" property="org.Employments"/> - <return-join alias="pers" property="emp.Employee"/> - </resultset> - - <sql-query name="person"> - <return alias="p" class="Person" lock-mode="upgrade"/> - SELECT NAME AS {p.Name}, PERID AS {p.Id} FROM PERSON WHERE PERID=? FOR UPDATE - </sql-query> - - <sql-query name="organization"> - <return alias="org" class="Organization"/> - <return-join alias="emp" property="org.Employments"/> - SELECT {org.*}, {emp.*} - FROM ORGANIZATION org - LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER - WHERE org.ORGID=? - </sql-query> - - - <!--sql-query name="organization"> - <return alias="org" class="Organization"/> - SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION - WHERE ORGID=? - </sql-query--> - - <sql-query name="allOrganizationsWithEmployees"> - <!-- TODO H3: add flush-mode="never" --> - <return alias="org" class="Organization"/> - SELECT DISTINCT org.NAME AS {org.Name}, org.ORGID AS {org.Id} - FROM ORGANIZATION org - INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID - </sql-query> - - <sql-query name="employment"> - <return alias="emp" class="Employment"/> - SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, - STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, - REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id} - FROM EMPLOYMENT - WHERE EMPID = ? - </sql-query> - - <sql-query name="organizationEmployments"> - <load-collection alias="empcol" role="Organization.Employments"/> - SELECT {empcol.*} - FROM EMPLOYMENT empcol - WHERE EMPLOYER = :id - ORDER BY STARTDATE ASC, EMPLOYEE ASC - </sql-query> - - - <sql-query name="organizationCurrentEmployments"> - <return alias="emp" class="Employment"> - <return-property name="Salary"> - <!-- as multi column properties are not supported via the - {}-syntax, we need to provide an explicit column list for salary via <return-property> --> - <return-column name="AVALUE"/> - <return-column name="CURRENCY"/> - </return-property> - <!-- Here we are remapping endDate. Notice that we can still use {emp.EndDate} in the SQL. --> - <return-property name="EndDate" column="myEndDate"/> - </return> - <synchronize table="EMPLOYMENT"/> - SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, - STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, - REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id}, AVALUE, CURRENCY - FROM EMPLOYMENT - WHERE EMPLOYER = :id AND ENDDATE IS NULL - ORDER BY STARTDATE ASC - </sql-query> - - <sql-query name="simpleScalar"> - <return-scalar column="name" type="string"/> - <return-scalar column="value1" type="long"/> - SELECT * FROM simpleScalar(:number) - </sql-query> - - <sql-query name="paramhandling"> - <return-scalar column="value1" type="long"/> - <return-scalar column="value2" type="long"/> - SELECT * FROM paramHandling( ?, ?) - </sql-query> - - <sql-query name="paramhandling_mixed"> - <return-scalar column="value1" type="long" /> - <return-scalar column="value2" type="long" /> - SELECT * FROM paramHandling( ?, :second) - </sql-query> - - <sql-query name="selectAllEmployments"> - <return class="Employment"> - <return-property name="Employee" column="EMPLOYEE"/> - <return-property name="Employer" column="EMPLOYER"/> - <return-property name="StartDate" column="STARTDATE"/> - <return-property name="EndDate" column="ENDDATE"/> - <return-property name="RegionCode" column="REGIONCODE"/> - <return-property name="id" column="EMPID"/> - <return-property name="Salary"> - <!-- as multi column properties are not supported via the - {}-syntax, we need to provide an explicit column list for salary via <return-property> --> - <return-column name="AVALUE"/> - <return-column name="CURRENCY"/> - </return-property> - </return> - SELECT * FROM selectAllEmployments - </sql-query> - - <database-object> - <create> -CREATE PROCEDURE selectAllEmployments -RETURNS(EMPLOYEE BIGINT, EMPLOYER BIGINT, STARTDATE TIMESTAMP, ENDDATE DATE, -REGIONCODE VARCHAR(255) CHARACTER SET WIN1252, EMPID BIGINT, AVALUE FLOAT, -CURRENCY VARCHAR(3) CHARACTER SET WIN1252) -AS -BEGIN -FOR SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, REGIONCODE, EMPID, AVALUE, CURRENCY FROM EMPLOYMENT -INTO :EMPLOYEE, :EMPLOYER, :STARTDATE, :ENDDATE, :REGIONCODE, :EMPID, :AVALUE, :CURRENCY DO -SUSPEND; -END; - </create> - <drop> - DROP PROCEDURE selectAllEmployments - </drop> - </database-object> - - <database-object> - <create> -CREATE PROCEDURE paramHandling(J INTEGER, I INTEGER) -RETURNS(VALUE1 INTEGER, VALUE2 INTEGER) -AS -BEGIN -VALUE1 = :J; -VALUE2 = :I; -SUSPEND; -END; - </create> - <drop> - DROP PROCEDURE paramHandling - </drop> - </database-object> - - <database-object> - <create> -CREATE PROCEDURE simpleScalar(ANUMBER INTEGER) -RETURNS(VALUE1 INTEGER, NAME VARCHAR(10) CHARACTER SET UNICODE_FSS) -AS -BEGIN -VALUE1 = :ANUMBER; -NAME = 'getAll'; -SUSPEND; -END; - </create> - <drop> - DROP PROCEDURE simpleScalar - </drop> - </database-object> - -</hibernate-mapping> Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdTest.cs 2009-02-08 12:46:06 UTC (rev 4071) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/FireBirdTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -1,21 +0,0 @@ -using System; -using System.Collections; -using NHibernate.Dialect; -using NUnit.Framework; - -namespace NHibernate.Test.SqlTest -{ - [TestFixture] - public class FireBirdTest : HandSQLTest - { - protected override IList Mappings - { - get { return new string[] {"SqlTest.FireBirdEmployment.hbm.xml"}; } - } - - protected override System.Type GetDialect() - { - return typeof(FirebirdDialect); - } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/HandSQLTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/HandSQLTest.cs 2009-02-08 12:46:06 UTC (rev 4071) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/HandSQLTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -1,162 +0,0 @@ -using System; -using System.Collections; -using NHibernate.Cfg; -using NUnit.Framework; - -namespace NHibernate.Test.SqlTest -{ - public abstract class HandSQLTest : TestCase - { - private static object GetFirstItem(IEnumerable it) - { - IEnumerator en = it.GetEnumerator(); - return en.MoveNext() ? en.Current : null; - } - - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - - protected abstract System.Type GetDialect(); - - private void CheckDialect() - { - if (!GetDialect().IsInstanceOfType(Dialect)) - Assert.Ignore("This test is specific for " + GetDialect()); - } - - protected override void Configure(Configuration cfg) - { - CheckDialect(); - base.Configure(cfg); - } - - [Test] - public void HandSQL() - { - ISession s = OpenSession(); - ITransaction t = s.BeginTransaction(); - Organization ifa = new Organization("IFA"); - Organization jboss = new Organization("JBoss"); - Person gavin = new Person("Gavin"); - Employment emp = new Employment(gavin, jboss, "AU"); - object orgId = s.Save(jboss); - s.Save(ifa); - s.Save(gavin); - s.Save(emp); - t.Commit(); - - t = s.BeginTransaction(); - Person christian = new Person("Christian"); - s.Save(christian); - Employment emp2 = new Employment(christian, jboss, "EU"); - s.Save(emp2); - t.Commit(); - s.Close(); - - sessions.Evict(typeof(Organization)); - sessions.Evict(typeof(Person)); - sessions.Evict(typeof(Employment)); - - s = OpenSession(); - t = s.BeginTransaction(); - jboss = (Organization) s.Get(typeof(Organization), orgId); - Assert.AreEqual(jboss.Employments.Count, 2); - emp = (Employment) GetFirstItem(jboss.Employments); - gavin = emp.Employee; - Assert.AreEqual(gavin.Name, "GAVIN"); - Assert.AreEqual(s.GetCurrentLockMode(gavin), LockMode.Upgrade); - emp.EndDate = DateTime.Today; - Employment emp3 = new Employment(gavin, jboss, "US"); - s.Save(emp3); - t.Commit(); - s.Close(); - - s = OpenSession(); - t = s.BeginTransaction(); - IEnumerator iter = s.GetNamedQuery("allOrganizationsWithEmployees").List().GetEnumerator(); - Assert.IsTrue(iter.MoveNext()); - Organization o = (Organization) iter.Current; - Assert.AreEqual(o.Employments.Count, 3); - - foreach (Employment e in o.Employments) - { - s.Delete(e); - } - - foreach (Employment e in o.Employments) - { - s.Delete(e.Employee); - } - s.Delete(o); - Assert.IsFalse(iter.MoveNext()); - s.Delete(ifa); - t.Commit(); - s.Close(); - } - - [Test] - public void ScalarStoredProcedure() - { - ISession s = OpenSession(); - IQuery namedQuery = s.GetNamedQuery("simpleScalar"); - namedQuery.SetInt64("number", 43L); - IList list = namedQuery.List(); - object[] o = (object[]) list[0]; - Assert.AreEqual(o[0], "getAll"); - Assert.AreEqual(o[1], 43L); - s.Close(); - } - - [Test] - public void ParameterHandling() - { - ISession s = OpenSession(); - - IQuery namedQuery = s.GetNamedQuery("paramhandling"); - namedQuery.SetInt64(0, 10L); - namedQuery.SetInt64(1, 20L); - IList list = namedQuery.List(); - object[] o = (Object[]) list[0]; - Assert.AreEqual(o[0], 10L); - Assert.AreEqual(o[1], 20L); - - namedQuery = s.GetNamedQuery("paramhandling_mixed"); - namedQuery.SetInt64(0, 10L); - namedQuery.SetInt64("second", 20L); - list = namedQuery.List(); - o = (object[]) list[0]; - Assert.AreEqual(o[0], 10L); - Assert.AreEqual(o[1], 20L); - s.Close(); - } - - [Test] - public void EntityStoredProcedure() - { - ISession s = OpenSession(); - ITransaction t = s.BeginTransaction(); - - Organization ifa = new Organization("IFA"); - Organization jboss = new Organization("JBoss"); - Person gavin = new Person("Gavin"); - Employment emp = new Employment(gavin, jboss, "AU"); - s.Save(ifa); - s.Save(jboss); - s.Save(gavin); - s.Save(emp); - - IQuery namedQuery = s.GetNamedQuery("selectAllEmployments"); - IList list = namedQuery.List(); - Assert.IsTrue(list[0] is Employment); - s.Delete(emp); - s.Delete(ifa); - s.Delete(jboss); - s.Delete(gavin); - - t.Commit(); - s.Close(); - } - } -} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,67 @@ +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest.Identity +{ + public abstract class IdentityInsertWithStoredProcsTest : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected abstract string GetExpectedInsertOrgLogStatement(string orgName); + + /// <summary> + /// Organization should be mappend with "identity" id strategy AND custom sql-insert (a stored proc). + /// The insert stored proc will return the new primary key and NH should recognize it and apply it + /// just like a normal insert. + /// </summary> + [Test] + public void InsertUsesStoredProc() + { + using (var spy = new SqlLogSpy()) + { + Organization ifa; + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + ifa = new Organization("IFA"); + s.Save(ifa); + t.Commit(); + } + + Assert.AreEqual(1, spy.Appender.GetEvents().Length, "Num loggedEvents"); + Assert.AreEqual(1, ifa.Id, "ifa.Id"); + Assert.AreEqual(GetExpectedInsertOrgLogStatement("IFA"), spy.Appender.GetEvents()[0].MessageObject, "Message 1"); + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + s.Delete(ifa); + t.Commit(); + } + } + + using (var spy = new SqlLogSpy()) + { + Organization efa; + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + efa = new Organization("EFA"); + s.Save(efa); + t.Commit(); + } + + Assert.AreEqual(1, spy.Appender.GetEvents().Length, "Num loggedEvents"); + Assert.AreEqual(2, efa.Id, "efa.Id"); + Assert.AreEqual(GetExpectedInsertOrgLogStatement("EFA"), spy.Appender.GetEvents()[0].MessageObject, "Message 2"); + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + s.Delete(efa); + t.Commit(); + } + } + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcs.hbm.xml (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcs.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcs.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcs.hbm.xml 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,201 @@ +<?xml version="1.0"?> +<!-- + + This mapping demonstrates the use of Hibernate with + all-handwritten SQL! + + This version is for Sybase/mssql +--> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.SqlTest" + default-access="field.camelcase"> + + <class name="Organization" table="ORGANIZATION"> + <id name="Id" unsaved-value="0" column="ORGID"> + <generator class="identity"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <set name="Employments" + inverse="true" + order-by="DUMMY"> + <key column="EMPLOYER"/> + <!-- only needed for DDL generation --> + <one-to-many class="Employment"/> + <loader query-ref="organizationEmployments"/> + </set> + <!-- query-list name="currentEmployments" + query-ref="organizationCurrentEmployments"--> + <loader query-ref="organization"/> + <sql-insert>exec nh_organization_native_id_insert ?</sql-insert> + <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update> + <sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete> + </class> + + <class name="Person" table="PERSON"> + <id name="Id" unsaved-value="0" column="PERID"> + <generator class="increment"/> + </id> + <property name="Name" not-null="true" column="NAME"/> + <loader query-ref="person"/> + <sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert> + <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> + <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> + </class> + + <class name="Employment" table="EMPLOYMENT"> + <id name="employmentId" unsaved-value="0" column="EMPID"> + <generator class="increment"/> + </id> + <many-to-one name="Employee" column="EMPLOYEE" not-null="true" update="false"/> + <many-to-one name="Employer" column="EMPLOYER" not-null="true" update="false"/> + <property name="StartDate" column="STARTDATE" not-null="true" update="false" insert="false"/> + <property name="EndDate" column="ENDDATE" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test"/> + <property name="RegionCode" column="REGIONCODE" update="false"/> + <property name="Salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test"> + <column name="VALUE" sql-type="float"/> + <column name="CURRENCY"/> + </property> + <loader query-ref="employment"/> + <sql-insert> + INSERT INTO EMPLOYMENT + (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) + VALUES (?, ?, getdate(), UPPER(?), ?, ?, ?) + </sql-insert> + <sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> + <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> + </class> + + <resultset name="org-emp-regionCode"> + <return-scalar column="regionCode" type="string"/> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + </resultset> + + <resultset name="org-emp-person"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + <return-join alias="pers" property="emp.Employee"/> + </resultset> + + <sql-query name="person"> + <return alias="p" class="Person" lock-mode="upgrade"/> + SELECT NAME AS {p.Name}, PERID AS {p.Id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/ + </sql-query> + + <sql-query name="organization"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.Employments"/> + SELECT {org.*}, {emp.*} + FROM ORGANIZATION org + LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER + WHERE org.ORGID=? + </sql-query> + + + <!--sql-query name="organization"> + <return alias="org" class="Organization"/> + SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION + WHERE ORGID=? + </sql-query--> + + <sql-query name="allOrganizationsWithEmployees" flush-mode="never"> + <return alias="org" class="Organization"/> + SELECT DISTINCT org.NAME AS {org.Name}, org.ORGID AS {org.Id} + FROM ORGANIZATION org + INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID + </sql-query> + + <sql-query name="employment"> + <return alias="emp" class="Employment"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id} + FROM EMPLOYMENT + WHERE EMPID = ? + </sql-query> + + <sql-query name="organizationEmployments"> + <load-collection alias="empcol" role="Organization.Employments"/> + SELECT {empcol.*} + FROM EMPLOYMENT empcol + WHERE EMPLOYER = :id + ORDER BY STARTDATE ASC, EMPLOYEE ASC + </sql-query> + + + <sql-query name="organizationCurrentEmployments"> + <return alias="emp" class="Employment"> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + <!-- Here we are remapping endDate. Notice that we can still use {emp.EndDate} in the SQL. --> + <return-property name="EndDate" column="myEndDate"/> + </return> + <synchronize table="EMPLOYMENT"/> + SELECT EMPLOYEE AS {emp.Employee}, EMPLOYER AS {emp.Employer}, + STARTDATE AS {emp.StartDate}, ENDDATE AS {emp.EndDate}, + REGIONCODE as {emp.RegionCode}, EMPID AS {emp.Id}, VALUE, CURRENCY + FROM EMPLOYMENT + WHERE EMPLOYER = :id AND ENDDATE IS NULL + ORDER BY STARTDATE ASC + </sql-query> + + <sql-query name="simpleScalar"> + <return-scalar column="name" type="string"/> + <return-scalar column="value" type="long"/> + exec simpleScalar :number + </sql-query> + + <sql-query name="paramhandling"> + <return-scalar column="value" type="long"/> + <return-scalar column="value2" type="long"/> + exec paramHandling ?, ? + </sql-query> + + <sql-query name="paramhandling_mixed"> + <return-scalar column="value" type="long" /> + <return-scalar column="value2" type="long" /> + exec paramHandling ?, :second + </sql-query> + + <sql-query name="selectAllEmployments"> + <return class="Employment"> + <return-property name="Employee" column="EMPLOYEE"/> + <return-property name="Employer" column="EMPLOYER"/> + <return-property name="StartDate" column="STARTDATE"/> + <return-property name="EndDate" column="ENDDATE"/> + <return-property name="RegionCode" column="REGIONCODE"/> + <return-property name="id" column="EMPID"/> + <return-property name="Salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + </return> + exec selectAllEmployments + </sql-query> + + <database-object> + <create> + CREATE PROCEDURE nh_organization_native_id_insert + ( + @NAME as varchar + ) + AS + BEGIN + INSERT INTO organization(NAME) VALUES(@NAME) + SELECT SCOPE_IDENTITY() + END + </create> + <drop> + IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'dbo.nh_organization_native_id_insert') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) + DROP PROCEDURE dbo.nh_organization_native_id_insert + </drop> + </database-object> +</hibernate-mapping> Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcs.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLIdentityInsertWithStoredProcsTest.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -0,0 +1,25 @@ +using System.Collections; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest.Identity.MsSQL +{ + [TestFixture] + public class MSSQLIdentityInsertWithStoredProcsTest : IdentityInsertWithStoredProcsTest + { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + protected override string GetExpectedInsertOrgLogStatement(string orgName) + { + return string.Format("exec nh_organization_native_id_insert @p0; @p0 = '{0}'", orgName); + } + + protected override IList Mappings + { + get { return new[] { "SqlTest.Identity.MsSQL.MSSQLIdentityInsertWithStoredProcs.hbm.xml" }; } + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs ___________________________________________________________________ Added: svn:mergeinfo + Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs 2009-02-08 12:46:06 UTC (rev 4071) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/IdentityInsertWithStoredProcsTest.cs 2009-02-08 13:37:25 UTC (rev 4072) @@ -1,68 +0,0 @@ -using NUnit.Framework; - -namespace NHibernate.Test.SqlTest -{ - // http://jira.nhibernate.org/browse/NH-727 - public abstract class IdentityInsertWithStoredProcsTest : TestCase - { - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - - protected abstract string GetExpectedInsertOrgLogStatement(string orgName); - - /// <summary> - /// Organization should be mappend with "identity" id strategy AND custom sql-insert (a stored proc). - /// The insert stored proc will return the new primary key and NH should recognize it and apply it - /// just like a normal insert. - /// </summary> - [Test] - public void InsertUsesStoredProc() - { - using (var spy = new SqlLogSpy()) - { - Organization ifa; - using (ISession s = OpenSession()) - using (ITransaction t = s.BeginTransaction()) - { - ifa = new Organization("IFA"); - s.Save(ifa); - t.Commit(); - } - - Assert.AreEqual(1, spy.Appender.GetEvents().Length, "Num loggedEvents"); - Assert.AreEqual(1, ifa.Id, "ifa.Id"); - Assert.AreEqual(GetExpectedInsertOrgLogStatement("IFA"), spy.Appender.GetEvents()[0].MessageObject, "Message 1"); - using (ISession s = OpenSession()) - using (ITransaction t = s.BeginTransaction()) - { - s.Delete(ifa); - t.Commit(); - } - } - - using (var spy = new SqlLogSpy()) - { - Organization efa; - using (ISession s = OpenSession()) - using (ITransaction t = s.BeginTransaction()) - { - efa = new Organization("EFA"); - s.Save(efa); - t.Commit(); - } - - Assert.AreEqual(1, spy.Appender.GetEvents().Length, "Num loggedEvents"); - Assert.AreEqual(2, efa.Id, "efa.Id"); - Assert.AreEqual(GetExpectedInsertOrgLogStatement("EFA"), spy.Appender.GetEvents()[0].MessageObject, "Message 2"); - using (ISession s = OpenSession()) - using (ITransaction t = s.BeginTransaction()) - { - s.Delete(efa); - t.Commit(); - } - } - } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLEmployment.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLEmployment.hbm.xml 2009-02-08 12:46:06 UTC (rev 4071) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/MSSQLEmployment.hbm.xml 2009-02-08 13:37:25 UTC (rev 4072) @@ -1,221 +0,0 @@ -<?xml version="1.0"?> -<!-- - - This mapping demonstrates the use of Hibernate with - all-handwritten SQL! - - This version is for Sybase/mssql ---> -<hibernate-mapping - xmlns="urn:nhibernate-mapping-2.2" - assembly="NHibernate.Test" - namespace="NHibernate.Test.SqlTest" - default-access="field.camelcase"> - - <class name="Organization" table="ORGANIZATION"> - <id name="Id" unsaved-value="0" column="ORGID"> - <generator class="increment"/> - </id> - <property name="Name" not-null="true" column="NAME"/> - <set name="Employments" - inverse="true" - order-by="DUMMY"> - <key column="EMPLOYER"/> - <!-- only needed for DDL generation --> - <one-to-many class="Employment"/> - <loader query-ref="organizationEmployments"/> - </set> - <!-- query-list name="currentEmployments" - query-ref="organizationCurrentEmployments"--> - <loader query-ref="organization"/> - <sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert> - <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-upd... [truncated message content] |