惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Webroot Blog
Webroot Blog
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
云风的 BLOG
云风的 BLOG
IT之家
IT之家
S
Secure Thoughts
U
Unit 42
G
GRAHAM CLULEY
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
The Cloudflare Blog
月光博客
月光博客
V
Visual Studio Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Schneier on Security
Schneier on Security
O
OpenAI News
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Privacy International News Feed
The Hacker News
The Hacker News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tailwind CSS Blog
SecWiki News
SecWiki News
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Simon Willison's Weblog
Simon Willison's Weblog
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
Last Week in AI
Last Week in AI
C
Check Point Blog
D
Docker
Scott Helme
Scott Helme
Engineering at Meta
Engineering at Meta
博客园_首页
W
WeLiveSecurity
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
J
Java Code Geeks
NISL@THU
NISL@THU
S
Security Affairs
C
Cybersecurity and Infrastructure Security Agency CISA
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - nerozhang

NHibernate小结(一) 数据库字符串处理 数据库中的字符串操作 通过查询语句链接到远程数据库 得到数据库表的结构 从两张表中取出不一致的数据 唐诗赏析--唐诗的起源,发展 PetShop 4.0的缓存处理 AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和PetShop4 的缓存示例 自定义 HttpModule 示例 在global.asax中实现URL重写(应用) Community Starter Kit - 结构 Community Starter Kit - 功能介绍 Community Starter Kit -简介 Petshop 4.0学习-MasterPage.master文件 PetShop 4.0学习-数据访问层之数据库访问设计 PetShop 4.0学习--登录以及注册功能的分析 PetShop 4.0学习--体系架构 PetShop 4.0学习--业务功能介绍
NHibernate Quick Start Guide
nerozhang · 2008-02-15 · via 博客园 - nerozhang

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