Skip to content

Commit 549d7ea

Browse files
author
Paul Hatcher
committedMar 30, 2005
Implemented Copy, enhanced versioning, support named query/sql-query
SVN: trunk@1367
1 parent 7117ad9 commit 549d7ea

22 files changed

+454
-235
lines changed
 

‎releasenotes.txt

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Build 0.8.0.0
1212
- Fixed bug with ISet.AddAll(ICollection) not being implemented. (Bill Hawes)
1313
- Modified discriminator element to use "null" or "not null" as the value.
1414
- Modified Dialect to use Hibernate 2.1 methods.
15+
- Added "unsaved-value" to version/timestamp as DateTime can't support null, use 1/1/0001 to align with .NET default value for DateTime
16+
- Added SaveOrUpdateCopy which allows synchronisation for detached objects
1517

1618
Build 0.7.0.0
1719
========================
+29-53
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,30 @@
11
<?xml version="1.0"?>
2-
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
3-
4-
<class
5-
name="NHibernate.DomainModel.Category, NHibernate.DomainModel"
6-
table="category"
7-
dynamic-update="true"
8-
dynamic-insert="true"
9-
>
10-
11-
<id
12-
name="Id"
13-
unsaved-value="0"
14-
>
15-
<generator class="native"/>
16-
</id>
17-
18-
<list
19-
name="Subcategories"
20-
lazy="true"
21-
cascade="all"
22-
>
23-
<key column="parent"/>
24-
<index column="ord"/>
25-
<one-to-many class="NHibernate.DomainModel.Category, NHibernate.DomainModel"/>
26-
</list>
27-
28-
<property name="Name"/>
29-
<many-to-one
30-
name="Assignable"
31-
column="`assign able id`"
32-
/>
33-
34-
</class>
35-
36-
<class
37-
name="NHibernate.DomainModel.Assignable, NHibernate.DomainModel"
38-
table="`assign able`"
39-
>
40-
<id name="Id">
41-
<generator class="assigned"/>
42-
</id>
43-
44-
<bag
45-
name="Categories"
46-
inverse="true"
47-
cascade="all"
48-
>
49-
<key column="`assign able id`"/>
50-
<one-to-many class="NHibernate.DomainModel.Category, NHibernate.DomainModel"/>
51-
</bag>
52-
</class>
53-
54-
</hibernate-mapping>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:nhibernate-mapping-2.0
3+
C:\Devel\Sourceforge\NHibernate\nhibernate\src\NHibernate\nhibernate-mapping-2.0.xsd">
4+
<class name="NHibernate.DomainModel.Category, NHibernate.DomainModel" table="category" dynamic-update="true" dynamic-insert="true">
5+
<id name="Id" unsaved-value="0" column="category_key_col">
6+
<generator class="native"/>
7+
</id>
8+
<list name="Subcategories" lazy="true" cascade="all">
9+
<key column="parent"/>
10+
<index column="ord"/>
11+
<one-to-many class="NHibernate.DomainModel.Category, NHibernate.DomainModel"/>
12+
</list>
13+
<property name="Name"/>
14+
<many-to-one name="Assignable" column="`assign able id`"/>
15+
</class>
16+
<class name="NHibernate.DomainModel.Assignable, NHibernate.DomainModel" table="`assign able`">
17+
<id name="Id">
18+
<generator class="assigned"/>
19+
</id>
20+
<bag name="Categories" inverse="true" cascade="all" lazy="true">
21+
<key column="`assign able id`"/>
22+
<one-to-many class="NHibernate.DomainModel.Category, NHibernate.DomainModel"/>
23+
</bag>
24+
</class>
25+
<sql-query name="namedsql">
26+
<return alias="category" class="NHibernate.DomainModel.Category, NHibernate.DomainModel"/>
27+
<return alias="assignable" class="NHibernate.DomainModel.Assignable, NHibernate.DomainModel"/>
28+
select {category.*}, {assignable.*} from Category {category}, "assign able" {assignable}
29+
</sql-query>
30+
</hibernate-mapping>

‎src/NHibernate.DomainModel/CustomPersister.cs

+5
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ public bool IsVersioned
186186
get { return false; }
187187
}
188188

189+
public bool IsDefaultVersion( object obj )
190+
{
191+
return false;
192+
}
193+
189194
public bool HasProxy
190195
{
191196
get { return false; }

‎src/NHibernate.DomainModel/Fum.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public Fum(FumCompositeID id)
2323
//TODO: H2.0.3 - this is diff from H2.0.3 because I am getting a null exception
2424
// when executing the Sql. H203 uses the CalendarType which we don't have so
2525
// I am using DateTime instead...
26-
m_LastUpdated = DateTime.Now;
26+
//m_LastUpdated = DateTime.Now;
2727

2828
FumCompositeID fid = new FumCompositeID();
2929
fid.Date= new DateTime(2004, 4, 29, 9, 50, 0, 0);
@@ -36,7 +36,7 @@ public Fum(FumCompositeID id)
3636
//TODO: H2.0.3 - this is diff from H2.0.3 because I am getting a null exception
3737
// when executing the Sql. H203 uses the CalendarType which we don't have so
3838
// I am using DateTime instead...
39-
f.LastUpdated = DateTime.Now;
39+
//f.LastUpdated = DateTime.Now;
4040

4141
_friends.Add( f );
4242
}
+21-48
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,36 @@
1-
<?xml version="1.0" ?>
1+
<?xml version="1.0"?>
22
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
3-
<class
4-
name="NHibernate.DomainModel.Fum, NHibernate.DomainModel"
5-
>
6-
<composite-id
7-
name="Id"
8-
unsaved-value="any"
9-
>
3+
<class name="NHibernate.DomainModel.Fum, NHibernate.DomainModel">
4+
<composite-id name="Id" unsaved-value="any">
105
<key-property name="String">
11-
<column
12-
name="string_"
13-
length="10"
14-
/>
6+
<column name="string_" length="10"/>
157
</key-property>
16-
<key-property
17-
name="Short"
18-
column="short_"
19-
/>
20-
<key-property
21-
name="Date"
22-
column="date_"
23-
type="DateTime"
24-
/>
8+
<key-property name="Short" column="short_"/>
9+
<key-property name="Date" column="date_" type="DateTime"/>
2510
</composite-id>
26-
27-
<version
28-
name="LastUpdated"
29-
type="DateTime"
30-
access="field.pascalcase-m-underscore"
31-
/>
32-
33-
<property
34-
name="FumString"
35-
not-null="true"
36-
/>
37-
11+
<version name="LastUpdated" type="DateTime" access="field.pascalcase-m-underscore" unsaved-value="1/1/0001"/>
12+
<property name="FumString" not-null="true"/>
3813
<many-to-one name="Fo">
39-
<column name="fo_string" length="10" />
40-
<column name="fo_short" />
41-
<column name="fo_date" />
14+
<column name="fo_string" length="10"/>
15+
<column name="fo_short"/>
16+
<column name="fo_date"/>
4217
</many-to-one>
43-
4418
<set name="Friends">
4519
<key>
46-
<column name="fr_string" length="10" />
47-
<column name="fr_short" />
48-
<column name="fr_date" />
20+
<column name="fr_string" length="10"/>
21+
<column name="fr_short"/>
22+
<column name="fr_date"/>
4923
</key>
50-
<one-to-many class="NHibernate.DomainModel.Fum, NHibernate.DomainModel" />
24+
<one-to-many class="NHibernate.DomainModel.Fum, NHibernate.DomainModel"/>
5125
</set>
52-
5326
<array name="QuxArray">
5427
<key>
55-
<column name="fum_str_" length="10" />
56-
<column name="fum_sho_" />
57-
<column name="fum_dat_" />
28+
<column name="fum_str_" length="10"/>
29+
<column name="fum_sho_"/>
30+
<column name="fum_dat_"/>
5831
</key>
59-
<index column="i" />
60-
<one-to-many class="NHibernate.DomainModel.Qux, NHibernate.DomainModel" />
32+
<index column="i"/>
33+
<one-to-many class="NHibernate.DomainModel.Qux, NHibernate.DomainModel"/>
6134
</array>
6235
</class>
63-
</hibernate-mapping>
36+
</hibernate-mapping>

‎src/NHibernate.DomainModel/Up.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public override bool Equals( object other )
4646
return this.id1.Equals( that.id1 ) && this.id2.Equals( that.id2 );
4747
}
4848

49-
public int GetHashcode()
49+
public override int GetHashCode()
5050
{
5151
return id1.GetHashCode();
5252
}

‎src/NHibernate.Test/MasterDetailTest.cs

+69-2
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,82 @@ public void Meta()
5151
}
5252

5353
[Test]
54-
[Ignore( "Test not written" )]
5554
public void Copy()
5655
{
56+
Category catWA = new Category();
57+
catWA.Name = "HSQL workaround";
58+
Category cat = new Category();
59+
cat.Name = "foo";
60+
Category subCatBar = new Category();
61+
subCatBar.Name = "bar";
62+
Category subCatBaz = new Category();
63+
subCatBaz.Name = "baz";
64+
cat.Subcategories.Add( subCatBar );
65+
cat.Subcategories.Add( subCatBaz );
66+
67+
ISession s = sessions.OpenSession();
68+
s.Save( catWA );
69+
s.Save( cat );
70+
s.Flush();
71+
s.Close();
72+
73+
cat.Name = "new foo";
74+
subCatBar.Name = "new bar";
75+
cat.Subcategories.Remove( subCatBaz );
76+
Category newCat = new Category();
77+
newCat.Name = "new";
78+
cat.Subcategories.Add( newCat );
79+
Category newSubCat = new Category();
80+
newSubCat.Name = "new sub";
81+
newCat.Subcategories.Add( newSubCat );
82+
83+
s = sessions.OpenSession();
84+
s.SaveOrUpdateCopy( cat );
85+
s.Flush();
86+
s.Close();
87+
88+
s = sessions.OpenSession();
89+
cat = (Category) s.CreateQuery( "from Category cat where cat.Name='new foo'").UniqueResult();
90+
newSubCat = (Category) s.CreateQuery( "from Category cat where cat.Name='new sub'").UniqueResult();
91+
newSubCat.Subcategories.Add( cat );
92+
subCatBaz = (Category) s.SaveOrUpdateCopy( newSubCat, subCatBaz.Id );
93+
Assert.IsTrue( subCatBaz.Name.Equals( "new sub" ) );
94+
Assert.IsTrue( subCatBaz.Subcategories.Count == 1 && subCatBaz.Subcategories[0] == cat );
95+
newSubCat.Subcategories.Remove( cat );
96+
s.Delete( cat );
97+
s.Delete( subCatBaz );
98+
s.Delete( catWA );
99+
s.Flush();
100+
s.Close();
57101
}
58102

59103
[Test]
60-
[Ignore( "Test not written" )]
61104
public void CopyCascade()
62105
{
106+
ISession s = sessions.OpenSession();
107+
Category child = new Category();
108+
child.Name = "child";
109+
s.Save( child );
110+
s.Flush();
111+
s.Close();
112+
113+
s = sessions.OpenSession();
114+
Category parent = new Category();
115+
parent.Name = "parent";
116+
parent.Subcategories.Add( child );
117+
child.Name = "child2";
118+
119+
// Save parent and cascade update detached child
120+
Category persistentParent = (Category) s.SaveOrUpdateCopy( parent );
121+
Assert.IsTrue( persistentParent.Subcategories.Count == 1 );
122+
Assert.AreEqual( ( (Category) persistentParent.Subcategories[ 0 ] ).Name, "child2" );
123+
s.Flush();
124+
s.Close();
125+
126+
s = sessions.OpenSession();
127+
s.Delete( parent );
128+
s.Flush();
129+
s.Close();
63130
}
64131

65132
[Test]

‎src/NHibernate/Cfg/Binder.cs

+17-6
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,10 @@ public static void BindRootClass(XmlNode node, RootClass model, Mappings mapping
335335
BindSimpleValue(subnode, val, false, propertyName, mappings);
336336
if ( val.Type==null ) val.Type = ( ("version".Equals(name)) ? NHibernateUtil.Int32 : NHibernateUtil.Timestamp );
337337
Mapping.Property timestampProp = new Mapping.Property(val);
338-
BindProperty(subnode, timestampProp, mappings);
338+
BindProperty( subnode, timestampProp, mappings );
339+
MakeVersion( subnode, val );
339340
model.Version = timestampProp;
340-
model.AddProperty(timestampProp);
341+
model.AddProperty( timestampProp );
341342
break;
342343

343344
case "discriminator":
@@ -1117,6 +1118,16 @@ private static void MakeIdentifier(XmlNode node, SimpleValue model, Mappings map
11171118
model.NullValue = "null";
11181119
}
11191120

1121+
private static void MakeVersion( XmlNode node, SimpleValue model )
1122+
{
1123+
// VERSION UNSAVED-VALUE
1124+
XmlAttribute nullValueNode = node.Attributes["unsaved-value"];
1125+
if (nullValueNode!=null)
1126+
model.NullValue = nullValueNode.Value;
1127+
else
1128+
model.NullValue = "null";
1129+
}
1130+
11201131
protected static void PropertiesFromXML(XmlNode node, PersistentClass model, Mappings mappings)
11211132
{
11221133
Table table = model.Table;
@@ -1401,15 +1412,15 @@ public static void BindRoot( XmlDocument doc, Mappings model )
14011412
foreach(XmlNode n in hmNode.SelectNodes( nsPrefix + ":query", nsmgr ) )
14021413
{
14031414
string qname = n.Attributes["name"].Value;
1404-
string query = n.FirstChild.Value;
1415+
string query = n.InnerText;
14051416
log.Debug("Named query: " + qname + " -> " + query);
1406-
model.AddQuery(qname, query);
1417+
model.AddQuery( qname, query );
14071418
}
14081419

14091420
foreach(XmlNode n in hmNode.SelectNodes( nsPrefix + ":sql-query", nsmgr ) )
14101421
{
14111422
string qname = n.Attributes["name"].Value;
1412-
NamedSQLQuery namedQuery = new NamedSQLQuery( n.FirstChild.Value );
1423+
NamedSQLQuery namedQuery = new NamedSQLQuery( n.InnerText );
14131424

14141425
foreach(XmlNode returns in n.SelectNodes( nsPrefix + ":return", nsmgr ) )
14151426
{
@@ -1433,7 +1444,7 @@ public static void BindRoot( XmlDocument doc, Mappings model )
14331444
}
14341445

14351446
log.Debug("Named sql query: " + qname + " -> " + namedQuery.QueryString );
1436-
model.AddSQLQuery(qname, namedQuery);
1447+
model.AddSQLQuery( qname, namedQuery );
14371448
}
14381449

14391450
foreach(XmlNode n in hmNode.SelectNodes(nsPrefix + ":import", nsmgr) )

‎src/NHibernate/Collection/Map.cs

+7
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ public override bool IsWrapper( object collection )
7878
return map == collection;
7979
}
8080

81+
/// <summary>
82+
///
83+
/// </summary>
84+
internal Map( ) : base( )
85+
{
86+
}
87+
8188
/// <summary>
8289
/// Construct an uninitialized Map.
8390
/// </summary>

0 commit comments

Comments
 (0)
Please sign in to comment.