一般情况下,我们在mapping时,会像这样写:
…… <property name="Name" column="NAME" type="String" length="30" /> <property name="Age" column="AGE" type="Int32" /> <property name="BirthDate" column="BIRTHDATE" type="DateTime" /> ……
NHibernate在持久化对象时,如果要插入NULL值就不太容易了,你必须对持久化对象的每个映射属性赋值,但对于DateTime类型的属性就更加麻烦了,由于ADO.NET对于插入的DateTime值有范围限制(1753-1-1 0:00:00到9999-12-31 23:59:59),否则会throw异常。所以在项目中我用1899-1-1 0:00:00来替代NULL值,可是总觉得不爽,在代码中总要作些判断,转换。于是see NHibernate Reference,果然有所发现。
NHibernate提供了Nullable的支持,对于每种数据类型都有对应的Nullable class(in Nullables.dll & Nullables.Nhibernate.dll)。如果希望插入NULL值,那么在对应的属性所映射的type中改为如下形式(修改上例)
…… <property name="Name" column="NAME" type="Nullables.NHibernate.NullableStringType, Nullables.NHibernate" length="30" /> <property name="Age" column="AGE" type="Nullables.NHibernate.NullableIntegerType, Nullables.NHibernate" /> <property name="BirthDate" column="BIRTHDATE" type="Nullables.NHibernate.NullableDateTimeType, Nullables.NHibernat" /> ……
同样,在对应的POJO文件中,改成这样:
private Nullables.NullableString name;
private Nullables.NullableDateTime birthDate;
……(其他属性略,Getter & Setter略)
OK,现在在代码中,我们即使不对某个DateTime,String类型的属性赋值,持久化到数据库中的值就是NULL了。