NHibernate自定义数据类型
2006-12-30 22:49
429 查看
NHibernate自定义数据类型
有时候在NHibernate中的基本数据类型可能不够好用,可以考虑自定义一个数据类型。
可以通过实现IUserType或者ICompositeUserType接口来实现这一功能。 ICompositeUserType较IUserType而言可以提供更多的控制。一般情况我们实现IUserType即可。
IUserType Members
比如:我想实现在数据库里存储格式为“数据;数据;数据”,而在类中体现为IList。这样我们可以减少一些一对多的映射。我们可以用它来存放EMail等数据。
自定义数据类:
using System;
using System.Collections;
using System.Data;
using System.Text;
using NHibernate;
using NHibernate.SqlTypes;
namespace Index.Data.NHibernateHelper
{
/**//// <summary>
/// 自定义的NH数据类型,使用;分隔存储多个数据
/// </summary>
public class DDLList : IUserType
{
private static readonly char SPLITTER = ';';
private static readonly SqlType[] TYPES = new SqlType[]
{NHibernateUtil.String.SqlType};
IUserType 成员#region IUserType 成员
/**//// <summary>
/// 提供自定义的完全复制方法
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public object DeepCopy(object value)
{
if (value == null)
{
return null;
}
IList sourceList = (IList) value;
IList targetList = new ArrayList();
for (int i = 0; i < sourceList.Count; i++)
{
targetList.Add(sourceList[i]);
}
return targetList;
}
/**//// <summary>
/// 本类型实例是否可变
/// </summary>
public bool IsMutable
{
get
{ return false; }
}
/**//// <summary>
/// 返回数据
/// </summary>
/// <param name="rs"></param>
/// <param name="names"></param>
/// <param name="owner"></param>
/// <returns></returns>
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
string value = (string) NHibernateUtil.String.NullSafeGet(rs, names[0]);
if (value != null)
{
return StringToList(value);
}
else
{
return null;
}
}
/**//// <summary>
/// 设置数据
/// </summary>
/// <param name="cmd"></param>
/// <param name="value"></param>
/// <param name="index"></param>
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value != null)
{
string str = ListToString((IList) value);
NHibernateUtil.String.NullSafeSet(cmd, str, index);
}
else
{
NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
}
/**//// <summary>
/// 返回的Sql
/// </summary>
public Type ReturnedType
{
get
{ return typeof (IList); }
}
/**//// <summary>
/// 返回的Sql类型
/// </summary>
public SqlType[] SqlTypes
{
get
{ return TYPES; }
}
public new bool Equals(object x, object y)
{
if (x == y)
{
return true;
}
if (x != null && y != null)
{
IList xList = (IList)x;
IList yList = (IList)y;
if (xList.Count != yList.Count)
{
return false;
}
for (int i = 0; i < xList.Count; i++)
{
string str1 = (string)xList[i];
string str2 = (string)yList[i];
if (str1 != str2)
{
return false;
}
}
return true;
}
return false;
}
#endregion
/**//// <summary>
/// 将string拼装成一个字符串,以“;”分隔
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
private string ListToString(IList list)
{
if (list.Count == 0)
{
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.Count - 1; i++)
{
sb.Append(list[i]).Append(SPLITTER);
}
sb.Append(list[list.Count - 1]);
return sb.ToString();
}
/**//// <summary>
/// 将“;”分隔的字符串解析为数组
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private IList StringToList(string value)
{
string[] strs = value.Split(SPLITTER);
IList emailList = new ArrayList();
for (int i = 0; i < strs.Length; i++)
{
emailList.Add(strs[i]);
}
return emailList;
}
}
}
在映射文件中如此设置
<property name="Email1" type="Index.Data.NHibernateHelper.DDLList,Index.Data.NHibernateHelper" column="Email1" />
在实体类中直接使用IList映射即可。
有时候在NHibernate中的基本数据类型可能不够好用,可以考虑自定义一个数据类型。
可以通过实现IUserType或者ICompositeUserType接口来实现这一功能。 ICompositeUserType较IUserType而言可以提供更多的控制。一般情况我们实现IUserType即可。
IUserType Members
Public Instance Properties
IsMutable | Are objects of this type mutable? |
ReturnedType | The type returned by NullSafeGet() |
SqlTypes | The SQL types for the columns mapped by this type. |
Public Instance Methods
DeepCopy | Return a deep copy of the persistent state, stopping at entities and at collections. |
Equals | Compare two instances of the class mapped by this type for persistent "equality" ie. equality of persistent state |
NullSafeGet | Retrieve an instance of the mapped class from a JDBC resultset. Implementors should handle possibility of null values. |
NullSafeSet | Write an instance of the mapped class to a prepared statement. Implementors should handle possibility of null values. A multi-column type should be written to parameters starting from index. |
自定义数据类:
using System;
using System.Collections;
using System.Data;
using System.Text;
using NHibernate;
using NHibernate.SqlTypes;
namespace Index.Data.NHibernateHelper
{
/**//// <summary>
/// 自定义的NH数据类型,使用;分隔存储多个数据
/// </summary>
public class DDLList : IUserType
{
private static readonly char SPLITTER = ';';
private static readonly SqlType[] TYPES = new SqlType[]
{NHibernateUtil.String.SqlType};
IUserType 成员#region IUserType 成员
/**//// <summary>
/// 提供自定义的完全复制方法
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public object DeepCopy(object value)
{
if (value == null)
{
return null;
}
IList sourceList = (IList) value;
IList targetList = new ArrayList();
for (int i = 0; i < sourceList.Count; i++)
{
targetList.Add(sourceList[i]);
}
return targetList;
}
/**//// <summary>
/// 本类型实例是否可变
/// </summary>
public bool IsMutable
{
get
{ return false; }
}
/**//// <summary>
/// 返回数据
/// </summary>
/// <param name="rs"></param>
/// <param name="names"></param>
/// <param name="owner"></param>
/// <returns></returns>
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
string value = (string) NHibernateUtil.String.NullSafeGet(rs, names[0]);
if (value != null)
{
return StringToList(value);
}
else
{
return null;
}
}
/**//// <summary>
/// 设置数据
/// </summary>
/// <param name="cmd"></param>
/// <param name="value"></param>
/// <param name="index"></param>
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value != null)
{
string str = ListToString((IList) value);
NHibernateUtil.String.NullSafeSet(cmd, str, index);
}
else
{
NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
}
/**//// <summary>
/// 返回的Sql
/// </summary>
public Type ReturnedType
{
get
{ return typeof (IList); }
}
/**//// <summary>
/// 返回的Sql类型
/// </summary>
public SqlType[] SqlTypes
{
get
{ return TYPES; }
}
public new bool Equals(object x, object y)
{
if (x == y)
{
return true;
}
if (x != null && y != null)
{
IList xList = (IList)x;
IList yList = (IList)y;
if (xList.Count != yList.Count)
{
return false;
}
for (int i = 0; i < xList.Count; i++)
{
string str1 = (string)xList[i];
string str2 = (string)yList[i];
if (str1 != str2)
{
return false;
}
}
return true;
}
return false;
}
#endregion
/**//// <summary>
/// 将string拼装成一个字符串,以“;”分隔
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
private string ListToString(IList list)
{
if (list.Count == 0)
{
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.Count - 1; i++)
{
sb.Append(list[i]).Append(SPLITTER);
}
sb.Append(list[list.Count - 1]);
return sb.ToString();
}
/**//// <summary>
/// 将“;”分隔的字符串解析为数组
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private IList StringToList(string value)
{
string[] strs = value.Split(SPLITTER);
IList emailList = new ArrayList();
for (int i = 0; i < strs.Length; i++)
{
emailList.Add(strs[i]);
}
return emailList;
}
}
}
在映射文件中如此设置
<property name="Email1" type="Index.Data.NHibernateHelper.DDLList,Index.Data.NHibernateHelper" column="Email1" />
在实体类中直接使用IList映射即可。
相关文章推荐
- NHibernate自定义数据类型
- 自定义函数名数据类型typedef int (init_fnc_t) (void);
- net控件中数据导到Excel的格式 首先,我们了解一下excel从web页面上导出的原理。当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果cell没有规定的格式,则excel会以默认的格式去呈现该cell的数据。这样就给我们提供了自定义数据格式的空间,当然我们必须使用excel支持的格式。下面就列出常用的一些格式: 1) 文本
- 自定义数据类型精度
- Hibernate的自定义数据类型实现接口之一——UserType祥解
- C++ 高级数据类型(六)—— 自定义数据类型
- 自定义数据类型 --- 枚举类型全解(swift2.3)
- Qt中菜单创建及自定义数据类型与QVariant互转
- C++ 用户自定义数据类型
- NHibernate系列文章六:NHibernate数据类型映射
- 自定义数据类型
- sas数据读取详解:SAS读取小工具,读取数值类型的注意事项,lrecl选项,四种读取数据方式以及数据指针的位置、读取mess data的、infile语句及其选项(dsd dlm missover truncover obs firstobs)、proc import、自定义缺失值
- Golang 如何定义一个接口类型的切片,它可以用来存储混合类型的数据,又如何自定义错误信息输出,以及如何定义变参函数,还有字符串多种拼接方式
- Hibernate自定义数据类型错误
- SQL SERVER2000教程-第三章 数据类型 第二节用户自定义类型
- hadoop自定义数据类型
- mapreduce 自定义数据类型的简单的应用
- 自定义数据类型varchar2(%n char)
- C++中 关于自定义数据类型
- 在SQL和ERWIN中用自定义类型、规则和默认值实现check约束从而保证数据的完整性