Sonntag, 30. August 2009

Bug in NHibernate 2.1 die Zweite

Da habe ich mich auf das neue Access-Feature none gefreut, das ja schon mit NH 2.0 und dem nop Wert eingeführt wurde, und jetzt funktioniert das für diesen Fall nicht. Ich habe folgende Classen:
public class Parent{
public long Id{get;set;}
public string Name{get;set;}
private IList<Child> children;
}

<class name="Parent">
<id name="Id">
<generator class="native" />
</ id>
<property name ="Name" />
<bag name ="children" access="field">
<key column="ParentId">
<one-to-many class="Child" />
</ bag>
</ class>

public class Child{
public long Id{get;set;}
public string Text{get;set}
public long ParentId{get;set}
}

<class name="Child" >
<id name="Id" >
<generator class="native" />
</ id>
<property name="Text" />
<property name="ParentId" />
</ class>
Es ist Absicht, dass ein Child nur die ParentId kennt und nicht den Parent direkt. Es ist ebenfalls Absicht, dass children ein private field ist ohne irgend einen Zugriff, da ich diese Variable zu NH 1.2 Zeiten ausschlisslich für Query-Zwecke brauchte. Es gab nun folgende Criteria:

using(var session = sessionFactory.OpenSession){
using(var transaction = session.BeginTransaction){
session.CreateCriteria<Parent>()
.Add(Restrictions.IsNotEmpty("children"))
.List<Parent>();
transaction.Commit();
}
}
Diese Query funktioniert wunderbar. Was mich stört, ist die unnüze Variable children. Durch das neue none Feature, was eigentlich genau dafür gemacht wurde, dachte ich diese Variable elemenieren zu können. Also löschte ich nun children aus der Parent-Klasse und änderte das Parent-Mapping:
<class name="Parent">
<id name="Id">
<generator class="native" />
</ id>
<property name ="Name" />
<bag name ="children" access="none">
<key column="ParentId">
<one-to-many class="Child" />
</ bag>
</ class>
Wenn ich die Query erneut ausführe, passiert jetzt etwas seltsames. Aus irgend einem Grund versucht NHibernate nun die ParentId im Child-Objekt auf NULL zu setzen. Mir ist schleierhaft wie das zu stande kommt. Auch cascade expliziet auf none zu schalten macht keinen Unterschied.

Ich haben den Fehler im NHibernate JIRA gemeldet und zähneknirschend das private field children wieder in die Parent-Klasse eingebunden.

Montag, 24. August 2009

Clean Code Developer (CCD)

Diesesmal will ich etwas über die CCD Initiative berichten. Im Grunde geht es dabei um Techniken, mit denen man seine Software besser machen kann. Dabei sind diese Techniken auf unterschiedliche Grade aufgeteilt.

Mit jedem Rang arbeitet man daran bestimmte Prinzipien und Praktiken während der Softwareentwicklung anzuwenden. Die ersten Ränge sind so aufgebaut, dass man die Praktiken für sich alleine erarbeiten kann. Dazu zählen einfache Prinzipien wie DRY (Don't repead your self) und KISS (Keep it simple and stupid) Bei späteren Rängen sollte das gesamte Team und letztendlich auch das Management beteiligt sein, da hier zum Teil auch Infrastruktur geschaffen werden muss. Als Beispiel sei Continuous Integration und Iterative Entwicklung genannt.

Ich persönlich arbeite gerade am gelben Grad und bin froh darüber, dass ich viele der Praktiken schon kenne und anwende. Somit kann das, was ich bisher gemacht habe, nicht komplett falsch gewesen sein.

Also ... keep the clean code!!!

Samstag, 22. August 2009

Bug in NHibernate 2.1 die Erste

Vor kurzem habe ich für eine Software ein Upgrade von NHibernate 1.2 nach NHibernate 2.1 durch geführt. Ich meinte "Ach das ist kein Problem, wir müssen nur ein paar Namespaces ändern".

Leider enthielt NH 2.1 nicht nur neue Features und Bugfixes, sondern auch tolle neue Bugs. So lieferten auf einmal Suchfunktionen der Software keine Ergebnisse mehr, die eine QBE verwendeten.

Also habe ich mir den Quelltext von NHibernate runtergeladen und selbst nach dem Fehler gesucht. Anscheinend wurde in der Example Klasse vergessen beim "EnableLike" den MatchMode zu übergeben. Ich habe den Bugfix an NHibernate JIRA geschickt, der in Version 2.1.1 und 3.x enthalten sein wird.

Beim schauen in den Quelltext sind mir ein paar Sachen aufgefallen wo es mich doch etwas gruselt. Aber dazu später mehr.