How to implement a custom type for NHibernate property

http://blog.miraclespain.com/archive/2008/Mar-18.html

 

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="SoftInn.Domain" >



  <class name="SoftInn.Domain.Archives.Archive" table="archive" lazy="false">   

    <!--Mapped classes must declare the primary key column of the database table. 

    Most classes will also have a property holding the unique identifier of an instance. 

    The <id> element defines the mapping from that property to the primary key column.-->

    <id name="Id" column="archive_id" type="Int64">

      <!--"column" is The name of the primary key column-->

      <generator class="SoftInn.Services.Internal.NHibernate.IdGenerator, SoftInn.Services">

        <param name="table">nextinstanceid</param>

        <param name="column">next</param>

        <param name="max_lo">9</param>

      </generator>

    </id>

    

    <version name="LastUpdateNumber" column="last_update_number" type="Int32" unsaved-value="-1"/>

    <component name="OwnerId" class="SoftInn.Domain.ObjectId">

      <property name="ClassId" column= "node_type" type="Int32"/>

      <property name="InstanceId" column= "node_id" type="Int64"/>

    </component>



    <property name="User" type="SoftInn.Services.Internal.NHibernate.UserType, SoftInn.Services" not-null="false">

      <column name="siuser_id"/>

    </property>    

    <property name="FullName" column= "full_name" type="String"/>    

    <property name="Name" column= "archive_name" type="String"/>

    <property name="NodeNamePath" column= "node_name_path" type="String"/>

    <property name="Size" column="archive_size" type="Int64"/>

    <property name="ZipSize" column="archive_physical_zip_size" type="Int64"/>    

    <property name="ContainsReports" column="contains_reports" type="YesNo"/>

    <property name="ContainsPermissions" column="contains_permissions" type="YesNo"/>

    <property name="FilteredByDateRange" column="is_filteredby_data_range" type="YesNo"/>

    <property name="StartDate" column= "start_datetime" type="SoftInn.Services.Internal.NHibernate.DateTimeType, SoftInn.Services"/>

    <property name="EndDate" column= "end_datetime" type="SoftInn.Services.Internal.NHibernate.DateTimeType, SoftInn.Services"/>

    <component name="PermissionOwnerId" class="SoftInn.Domain.ObjectId">

      <property name="ClassId" column= "permissionowner_type" type="Int32"/>

      <property name="InstanceId" column= "permissionowner_id" type="Int64"/>

    </component>

    <property name="PermissionOwnerName" column= "permissionowner_name" type="String"/>

    <property name="CreateDate" column= "create_datetime" type="SoftInn.Services.Internal.NHibernate.DateTimeType, SoftInn.Services"/>

    <property name="Status" column= "status" type="String"/>    

  </class>



</hibernate-mapping>

 

 

namespace SoftInn.Services.Internal.NHibernate {



    /// <summary>

    /// Used to retrieve and store generic User object relationships via an "InstanceId" column

    /// </summary>

    public class UserType : BaseEntityType {



        /// <see cref="SoftInn.Services.Internal.NHibernate.BaseEntityType.ReturnedClass"/>

        public override Type ReturnedClass {

            get { return typeof(User); }

        }

    }

}

  

using System;

using NHibernate;

using NHibernate.Engine;

using NHibernate.Type;

using NHibernate.UserTypes;

using SoftInn.Domain;

using SoftInn.Platform.Log;



namespace SoftInn.Services.Internal.NHibernate {



    /// <summary>

    /// Abstract base class for classes used to retrieve and store 

    /// generic Persistent object relationships via an "InstanceId" column.

    /// </summary>

    public abstract class BaseEntityType : ICompositeUserType {



        #region ICompositeUserType Members



        /// <summary>See base class documentation</summary>

        public string[] PropertyNames {

            get { return new String[] { "InstanceId" }; }

        }



        /// <summary>See base class documentation</summary>

        public IType[] PropertyTypes {

            get {

                return new IType[] { NHibernateUtil.Int64 };

            }

        }



        /// <summary>See base class documentation</summary>

        public abstract Type ReturnedClass {

            get;

        }



        /// <summary>See base class documentation</summary>

        public object Assemble(object cached, ISessionImplementor session, object owner) {

            return DeepCopy(cached);

        }



        /// <summary>See base class documentation</summary>

        public object DeepCopy(object value) {

            return value;

        }



        /// <summary>See base class documentation</summary>

        public object Disassemble(object value, ISessionImplementor session) {

            return DeepCopy(value);

        }



        /// <summary>See base class documentation</summary>

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]

        public object GetPropertyValue(object component, int property) {

            if (component == null) {

                throw new ArgumentNullException("component");

            }



            if (property == 0) {

                return ((Entity)component).ObjectId.InstanceId;

            } else {

                return null;

            }

        }



        /// <summary>See base class documentation</summary>

        public bool IsMutable {

            get { return true; }

        }



        /// <summary>See base class documentation</summary>

        public object NullSafeGet(System.Data.IDataReader dr, string[] names, ISessionImplementor session, object owner) {

            object instanceIdObj = NHibernateUtil.Int64.NullSafeGet(dr, names[0], session, owner);



            if (instanceIdObj == null ) {

                // Null instanceId means a null entity reference.

                return null;

            }



            Int64 instanceId = (Int64)instanceIdObj;



            // Construct an ObjectId for this instanceId.

            ObjectId entityId = new ObjectId(ReturnedClass, instanceId);



            try {

                // Find and return the corresponding Entity object.

                return ServiceDirectory.PersistServices.FindById(entityId, true);



            } catch (SoftInn.Services.Exceptions.ObjectNotFoundException) {

                // The referenced entity no longer exists, but we still have a reference to it by ID.

                LogManager.LogError(ServicesLogMessages.LOG_CONTEXT,

                    ServicesLogMessages.PERSIST_MISSING_OBJECT,

                    null, entityId.ToString(), GetType().FullName + ".NullSafeGet");

                //throw;

                return null;

            }

        }



        /// <summary>See base class documentation</summary>

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2233:OperationsShouldNotOverflow", MessageId = "index+1")]

        public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index, ISessionImplementor session) {



            Entity entity = (value == null) ? null : (Entity)value;



            if (entity != null && entity.ObjectId != null) {

                // Entity with an ObjectId... store the instance id and class id.

                Int64 instanceId = entity.ObjectId.InstanceId;

                NHibernateUtil.Int64.NullSafeSet(cmd, instanceId, index, session);



            } else {

                // Null entity... store null instance id and class id.

                NHibernateUtil.Int64.NullSafeSet(cmd, null, index, session);

            }

        }



        /// <summary>See base class documentation</summary>

        public void SetPropertyValue(object component, int property, object value) {

        }



        #endregion



        /// <summary>See base class documentation</summary>

        public new bool Equals(object obj1, object obj2) {

            if (obj1 == null) {

                return obj2 == null;

            } else {

                return obj1.Equals(obj2);

            }

        }



        /// <summary>See base class documentation</summary>

        public int GetHashCode(object obj1) {

            if (obj1 != null) {

                return obj1.GetHashCode();

            }

            else {

                return this.GetHashCode();

            }

        }



        /// <summary>See base class documentation</summary>

        public object Replace(object original, object target, ISessionImplementor session, object owner) {

            return original;

        }



    }

}

  

你可能感兴趣的:(Hibernate)