1 实体类:

Code

注意点:在属性之前要加上virtual关键字,否则运行时会报错。


2 map文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples.QuickStart" table="users">
    
<id name="Id" column="LogonId" type="String" length="20">
      
<generator class="assigned" />
    
</id>
    
<property name="UserName" column="Name" type="String" length="40"/>
    
<property name="Password" type="String" length="20"/>
    
<property name="EmailAddress" type="String" length="40"/>
    
<property name="LastLogon" type="DateTime"/>
  
</class>
</hibernate-mapping>

注意点:如果对应的是.net framework2.0的版本,则

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">2.2

其次是class name一定要写对。前面是要映射类的全称,后面是namespase,也就是Assembly的名称。

还有在生成操作中一定要选:嵌入的资源。

1class: name属性指示了Post实体类的类名和所在的Assebmly的名称,NH将通过反射的方式找到所指示的实体类,关于.Net的反射的说明,请参考MSDN; table属性指示了该实体所对应的数据表的表名

2property: 指示实体属性和数据列的如何映射。name为实体的属性名称,实体的该属性可以为public/private/protected,甚至是 internalcolumn指示了该属性对应的数据列,若实体属性名称和数据列名称相同(忽视大小写),可以省略;type指示了实体属性的.Net 数据类型,可以省略,NH可以自动转换;length只是对string类型的属性适用,指示了字符串的最大长度。

3id: 指示主键。NH支持自动生成主键、数据库生成主键和手工赋值三种方式,我们这里手工赋值的方式,设定generatorclass="assigned"

3 hibernate.cfg.xml—配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section
      
name="nhibernate" 
      type
="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    
/>
  
</configSections>

  
<nhibernate>
    
<add 
      
key="hibernate.connection.provider"
      value
="NHibernate.Connection.DriverConnectionProvider"
    
/>
    
<add
      
key="hibernate.dialect"
      value
="NHibernate.Dialect.MsSql2000Dialect"
    
/>
    
<add
      
key="hibernate.connection.driver_class"
      value
="NHibernate.Driver.SqlClientDriver"
    
/>
    
<add
      
key="hibernate.connection.connection_string"
      value
="Server=192.168.0.11;database=NHibernate;uid=sa;pwd=davey@citiz.net;"
    
/>
  
</nhibernate>
</configuration>

注意:hibernate.connection.connection_string是数据库的连接字符串。

4 测试类:

using NHibernate;

using NHibernate.Cfg;

这两个是必须的。

        [SetUp]
        
public void BuildNHibernate()
        
{
            cfg 
= new Configuration();
            cfg.AddAssembly(
"NHibernate.Examples.QuickStart");
            factory 
= cfg.BuildSessionFactory();
            session 
= factory.OpenSession();

        }


在使用NHibernate进行数据库操作时需要以上这些东西。

3 Insert

Code


4 update:
Code

5 select

根据主键查询

IList<User> userList = session.CreateCriteria(typeof(User)).List<User>();
有条件的查询
IList<User> recentUsers = session.CreateCriteria(typeof(User))
              .Add(Expression.Expression.Eq(
"UserName""Joseph Cool"))
                .List
<User>();

利用Hql语言查询
string hql = "  from User u where u.UserName = :Name ";
            IQuery query 
= session.CreateQuery(hql);
            query.SetString(
"Name","Joseph Cool");
            IList
<User> recentUsers = query.List<User>();

6 一对多,多对多关系的查询

实体类:

Category

Code


Item

Code

Category中包含类Item,是一对多的关系。

映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="NHibernate.Examples.OneToMany.Category, NHibernate.Examples.OneToMany" table="nh_categories">
    
<id name="CategoryID" column="CategoryID" type="Guid" 
      unsaved-value
="00000000-0000-0000-0000-000000000000">
      
<generator class="guid" />
    
</id>
    
<property name="Name" type="string" length="50" />
    
<bag name="Items" lazy="true" inverse="true" cascade= "all-delete-orphan">
    
<key column="CategoryID" />
    
<one-to-many class="NHibernate.Examples.OneToMany.Item, NHibernate.Examples.OneToMany" />
    
</bag>
  
</class>
  
<class name="NHibernate.Examples.OneToMany.Item, NHibernate.Examples.OneToMany" table="nh_items">
    
<id name="ItemID" column="ItemID" type="Guid" 
      unsaved-value
="00000000-0000-0000-0000-000000000000">
      
<generator class="guid" />
    
</id>
    
<property name="Name" type="string" length="50" />
    
<many-to-one name="Category" class="NHibernate.Examples.OneToMany.Category, NHibernate.Examples.OneToMany" 
    column
="CategoryID" />
  
</class>
</hibernate-mapping>


其中在Category中指定了一对多的关系:

    <bag name="Items" lazy="true" inverse="true" cascade= "all-delete-orphan">
    
<key column="CategoryID" />
    
<one-to-many class="NHibernate.Examples.OneToMany.Item, NHibernate.Examples.OneToMany" />
</bag>


且指定了级联关系。
在类Item中指定了多对一的关系:

<many-to-one name="Category" class="NHibernate.Examples.OneToMany.Category, NHibernate.Examples.OneToMany" column="CategoryID" />


测试方法1(插入):

Code


测试方法2(级联删除):

Code


posted on 2008-02-15 22:13  nerozhang  阅读(774)  评论(0编辑  收藏  举报