澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:学科入门,hibernate开辟

Nhibernate 4.0 教程

Nhibernate 4.0 教程入门,nhibernate4.0

Nhibernate 4.0 教程

目录

1.      下载Nhibernate 4.04. 1

2.      入门教程... 2

3.      测试项目详解... 3

4.      总结... 7

附:关联知识点... 7

知识点1:C#静态构造函数... 7

知识点2:关于Visual Studio文件生成操作... 8

 

 

前言:

       为什么会有这个框架?这就牵扯进了Java和C#的恩恩怨怨,Java是开源的面向对象语言的代表,围绕Java的有不计其数的开源框架,其中ORM框架(不要问我什么是ORM框架)中的最耀眼的代表就是Hibernate;C#也是Microsoft紧跟在Java后面推出的面向对象的语言,这两个相似度太大了(我读书自己学习的Java,后面C#就没特殊的学习过,直接就进行拿来用了),.NET开发者也参照Hibernate开发了一个针对.NET平台下的ORM 框架,也就是Nhibernate。

 

开发环境:

       Windows 7

       Visual Studio 2013

       Nhibernate 4.04

       Microsoft Sql Server 2012

       直接下载 官网地址

      NHibernate is a mature, open source object-relational mapper for the .NET framework. It's actively developed, fully featured and used in thousands of successful projects.

       官网介绍了Nhibernate是针对.NET框架的成熟的、开源的面向关系型数据库映射(ORM).

       或者使用VS2013附带的NuGet管理程序直接安装(NuGet,.NET下面一个开源的程序包管理工具):Install-Package Nhibernate(非常的快)

澳门新浦京娱乐场网站 1

 

 

       新建一个项目NHOne和测试程序,并且添加对于该项目的测试项目,项目架构如下:

澳门新浦京娱乐场网站 2

 

 

划重点:其中对于Nhibernate的配置文件(hibernate.cfg.xml与ClassMapping文件,对于生成的操作,必须选择始终复制和嵌入式资源。(不然编译调试的时候会出现bug,比如没有Model Class的Mapping等等)。

3.1     初始化C#解决方案NHOne(控制台应用程序和对应的测试项目)

       给每一个项目添加Nhibernate引用,测试项目也需要(直接NuGet命令安装即可)

3.2     编写NHibernate配置文件

       在NHOne的根目录下添加hibernate.cfg.xml文件(生成操作嵌入式资源和始终复制),在文档属性中架构选择hibernate-configuration-2.2 & hibernate-mapping-2.2两个文件,这样编写hibernate.cfg.xml就会有自动提示的功能(这两个文件在我们解决方案NHOne的packages/Nhibernate目录中)

 

 

hibernate.cfg.xml 具体内容如下:

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

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

  <session-factory>

    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

    <property name="connection.connection_string">Data Source=localhost;user=sa;password=12345;Initial Catalog=test</property>

    <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>

    <property name="show_sql">true</property>

    <property name="hbm2ddl.auto">update</property>

   

    <!--Mapping files 嵌入式资源 表格table 名字不可以是user-->

    <mapping  assembly="NHOne"/>

  </session-factory>

 

</hibernate-configuration>

 

<mapping assembly=”NHOne”/> 这里写的是项目的名字,然后就会搜寻项目下面所有的后缀是.hbm.xml的文件,也可以手动自己添加,比较麻烦,有机会再详细讲解。

3.3     编写Model Class “User”

         所有的属性都是使用virtual来修饰(延迟加载有用),添加对应的get set方法

         在MSServer 中,user 是关键字,因此不能够有user的表格,可以使用其他来代替

         在实际应用中,每一个model类,很可能需要提供Equals() HashCode() ToString()方法的重写

namespace NHOne.Model

{

    public class User

    {

        private string id;

        private string username;

        private string password;

        private char gender; //"F" & "M"

        private int age;

        private string phone;

 

        public User()

        {

 

        }

 

        public User(string username, string password, char gender, int age, string phone)

        {

            this.username = username;

            this.password = password;

            this.gender = gender;

            this.age = age;

            this.phone = phone;

        }

 

        public User(string id, string username, string password, char gender, int age, string phone)

        {

            this.id = id;

            this.username = username;

            this.password = password;

            this.gender = gender;

            this.age = age;

            this.phone = phone;

        }

        public virtual string Id { get; set; }

        public virtual string Username { get; set; }

        public virtual string Password { get; set; }

        public virtual char Gender { get; set; }

        public virtual int Age { get; set; }

        public virtual string Phone { get; set; }

        public override bool Equals(object obj)

        {

            if (this == obj)

            {

                return true;

            }

            User user = obj as User;

            if (user == null)

            {

                return false;

            }

            else

            {

                return this.Username.Equals(user.Username);

            }

        }

 

        public override int GetHashCode()

        {

            return Username.GetHashCode();

        }

 

        public override string ToString()

        {

            return "id:" Id ";  Username:" Username ";  Password:" Password ";  Gender:" Gender ";  Age:" Age ";    Phone:" Phone;

        }

    }

}

3.4  编写Model的Mapping文件

    位于Mapping目录下面新建文件User.hbm.xml文件(嵌入式资源,添加文件的架构为hibernate-mapping-2.2.xml),红色部分 assembly是项目的名称,namespace是在项目中Model类的命名空间,如果省略的话,需要在后面的class name属性中填写完整的名字空间和类名。

注意table的名字不能写成user,否则报错,因为user是数据库的关键字

内容如下:

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

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHOne" namespace="NHOne.Model" default-lazy="true">

  <class name="User" table="client">

    <id name="Id">

      <column name="user_id" sql-type="char(32)" not-null="true"/>

      <generator class="uuid.hex"/>

    </id>

    <property name="Username" column="username"  not-null="true"/>

    <property name="Password" column="password" not-null="true" />

    <property name="Gender"   column="gender"   />

    <property name="Age"      column="age"      />

    <property name="Phone"    column="phone"    />

  </class>

</hibernate-mapping>

 

3.5    编写NHibernate的帮助类,初始化NHibernate的环境,获取Session

       在Util命名空间下,添加YangNHibernate的类,具体内容如下:

namespace NHOne.Util

{

    public class YangNHibernate

    {

        private static readonly  ISessionFactory sessionFactory;

        private static string HibernateHbmXmlFileName = "hibernate.cfg.xml";

        //private static ISession session

        static YangNHibernate()

        {

            sessionFactory = new Configuration().Configure().BuildSessionFactory();

        }

        public static ISessionFactory getSessionFactory()

        {

            return sessionFactory;

        }

        public static ISession getSession()

        {

            return sessionFactory.OpenSession();

        }

        public static void closeSessionFactory()

        {

            

        }

    }

}

 

3.6    编写测试代码

       在测试类中测试保存User到数据库,使用事务的机制

        [TestMethod]

        public void TestSaveUser()

        {

            User user = createUser();

            ISession session  = YangNHibernate.getSession();

            ITransaction tx = session.BeginTransaction();

            session.Save(user);

            tx.Commit();

            session.Close();

       

        }

 

调试程序:

澳门新浦京娱乐场网站 3

 

 

 

       NHibernate是C#程序员,参照Java的ORM框架Hibernate实现的一个开源项目,在C#中项目开发中非常的便捷高效,让程序猿从复杂的SQL语句中解放出来,对于项目的模块化非常好用。

       测试项目的源代码地址:

                

参考文档:

附:关联知识点

知识点1:C#静态构造函数

C#关于静态构造函数的知识,自动调用初始化静态的成员属性,尤其是readonly修饰的静态属性,与Java中的静态代码块类似。

参考MSDN给出的解释:

       A static constructor is used to initialize any static data, or to perform a particular action that needs to be performed once only. It is called automatically before the first instance is created or any static members are referenced.

       因为静态构造函数是.NET自动调用的,因此改代码块就无需使用修饰符修饰。

关于C#静态构造函数的特征,具体如下:

       A static constructor does not take access modifiers or have parameters.

       A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced.

       A static constructor cannot be called directly.

       The user has no control on when the static constructor is executed in the program.

       A typical use of static constructors is when the class is using a log file and the constructor is used to write entries to this file.

       Static constructors are also useful when creating wrapper classes for unmanaged code, when the constructor can call the LoadLibrary method.

       If a static constructor throws an exception, the runtime will not invoke it a second time, and the type will remain uninitialized for the lifetime of the application domain in which your program is running.

 

知识点2:关于Visual Studio文件生成操作

Visual Studio生成操作有以下几个选项:

       Non(无):也就是在项目生成的时候不进行任何的操作,在生成的目录中没有此文件,一般用于项目描述文件.

       Content(内容):也就是将文件直接复制到输出目录中,一般用于html等静态文件.

       Compile(编译):编译代码文件,通常的代码文件需要编译

       Embedded Resource(嵌入式资源):将该文件作为DLL或可执行文件嵌入到主目录中,通常用于资源文件,比如Nhibernate的配置文件等等。

 

4.0 教程入门,nhibernate4.0 Nhibernate 4.0 教程 目录 1. 下载Nhibernate 4.04. 1 2. 入门教程... 2 3. 测试项目详解... 3 4. 总结... 7 附:关联知识...

        遇到的问题描述:Hibernate中JUnit版本导致空指针异常问题

Hibernate框架开发步骤
项目导入需要的jar包:

编写hibernate.cfg.xml文件
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          ";
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
    <session-factory>
        <!-- 配置连接数据库信息 -->
        <!-- 加载数据库的URL -->
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property>
        <!-- 数据库连接名 -->
        <property name="connection.username">root</property>
        <!-- 数据库的连接密码 -->
        <property name="connection.password">123456</property>
        <!-- 加载数据库驱动 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>   
    <!-- 配置hibernate属性信息 -->
    <!-- 设置数据库方言 -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- 后台是否显示SQL语句 -->
    <property name="show_sql">true</property>
    <!-- 是否格式化SQL语句 -->
    <property name="format_sql">true</property>
    <!-- 设置数据库生成策略 默认为update-->
    <property name="hbm2ddl.auto">update</property>
    <!-- 加载hibernate映射文件 -->
    <mapping resource="com/edu/bean/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
编写实体类,创建表
eg:
package com.edu.bean;

目录

首先我说明一下我遇到的问题:初次使用Hibernate时,没有仔细听项目负责人介绍Hibernate,而使用了Hibernate中的JUnit5,以至于后面一直出现空指针异常,排
除也排除不了,代码找不到错误。
下面是我的数据库、工程和代码:
数据库:

public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
// TODO Auto-generated constructor stub
}
}
编写映射文件
eg:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
";
<hibernate-mapping>
<!-- name对应实体类,table对应数据库中的表 -->
<class name="com.edu.bean.User" table="user">
<!-- name对应实体类中属性名,column对应表中字段 ,type为表中字段类型-->
<id name="id" column="id">
<!-- 设置主键生成策略 -->
<generator class="identity"></generator>
</id>
<property name="username" type="string" column="username"></property>
<property name="password" type="string" column="password"></property>
澳门新浦京娱乐场网站,</class>
</hibernate-mapping>
将映射文件放入到hibernate.cfg.xml
<!-- 加载hibernate映射文件 -->
<mapping resource="com/edu/bean/User.hbm.xml"/>
编写代码:
eg:
package com.edu.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.edu.bean.User;
public class HibernateTest {
@Test
public void test(){
//读取hibernate.cfg.xml主配置文件
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
//创建SessionFactory工厂
SessionFactory sf=cfg.buildSessionFactory();
//获取session
Session session=sf.openSession();
//创建事务
Transaction tc=session.beginTransaction();
//创建User对象
User user=new User("张三", "123456");
//持久化对象
try{
//保存数据
session.save(user);
//提交事务(不可少)
tc.commit();
}catch(Exception e){
//数据操作失败,回滚事务
tc.rollback();
}
//关闭session
session.close();
}
}
代码分层优化:
获取Session的HibernateGetSession类:
package com.edu.dbconn;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateGetSession {
//保证SessionFactory工厂只创建一次
private static SessionFactory sf;
static{
if(sf==null){
//读取hibernate.cfg.xml主配置文件
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
//创建SessionFactory工厂
sf=cfg.buildSessionFactory();
}
}
public static Session getSession(){
//创建session
Session session=sf.openSession();
return session;
}
}
Dao层的UserDao类:
package com.edu.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.edu.bean.User;
import com.edu.dbconn.HibernateGetSession;

1.      下载Nhibernate 4.04. 1

澳门新浦京娱乐场网站 4

public class UserDao {
public void saveUser(){
//获取session
Session session=HibernateGetSession.getSession();
//创建事务
Transaction tc=session.beginTransaction();
//创建User对象
User user=new User("李四", "123456");
//持久化对象
try{
//保存数据
session.save(user);
//提交事务(不可少)
tc.commit();
}catch(Exception e){
//数据操作失败,回滚事务
tc.rollback();
}
//关闭session
session.close();
}
}
测试层:
package com.edu.test;
import org.junit.Test;
import com.edu.dao.UserDao;
public class HibernateTest {
@Test
public void test(){
UserDao ud=new UserDao();
ud.saveUser();
}
}
实例源码:

2.      入门教程... 2

图片.png

3.      测试项目详解... 3

澳门新浦京娱乐场网站 5

4.      总结... 7

图片.png

附:关联知识点... 7

工程:

知识点1:C#静态构造函数... 7

澳门新浦京娱乐场网站 6

知识点2:关于Visual Studio文件生成操作... 8

1.png

 

代码:UserDao.java类
package com.qianfeng.dao;

 

import org.hibernate.Session;
import com.qianfeng.model.User;
import com.qianfeng.tools.DBUtil;

前言:

public class UserDao {
public User selectById(Integer id) {
Session session=DBUtil.findsession();
User user = (User) session.get(User.class,id);
return user;
}
}

       为什么会有这个框架?这就牵扯进了Java和C#的恩恩怨怨,Java是开源的面向对象语言的代表,围绕Java的有不计其数的开源框架,其中ORM框架(不要问我什么是ORM框架)中的最耀眼的代表就是Hibernate;C#也是Microsoft紧跟在Java后面推出的面向对象的语言,这两个相似度太大了(我读书自己学习的Java,后面C#就没特殊的学习过,直接就进行拿来用了),.NET开发者也参照Hibernate开发了一个针对.NET平台下的ORM 框架,也就是Nhibernate。

User.java类:
package com.qianfeng.model;

 

import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private Integer gender;
private Integer age;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User() {
super();
}
}

开发环境:

User.hbm.xml文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

       Windows 7

<hibernate-mapping>
<class name="com.qianfeng.model.User" table="JAVATEST">

       Visual Studio 2013

<id name="id" column="ID"></id>

       Nhibernate 4.04

<property name="username" column="USERNAME"></property>
<property name="password" column="PASSWORD"></property>
<property name="gender" column="GENDER"></property>
<property name="age" column="AGE"></property>
<property name="address" column="ADDRESS"></property>
</class>
</hibernate-mapping>

       Microsoft Sql Server 2012

HibernateTest.java类:
package com.qianfeng.test;

  1. 下载Nhibernate 4.04

//import org.junit.Before;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import com.qianfeng.dao.UserDao;
import com.qianfeng.model.User;

       直接下载 官网地址(自己下载网速真的好慢)

public class HibernateTest {
//UserDao dao;
/@Before
public static void init() {
dao=new UserDao();
}
/
static UserDao dao;
@BeforeAll
public static void init() {
dao=new UserDao();
}
@Test
public void test() {
System.out.println(dao);
User user=dao.selectById(1);
System.out.println(user); System.out.println(user.getId() "," user.getUsername() "," user.getPassword());
}
}

      NHibernate is a mature, open source object-relational mapper for the .NET framework. It's actively developed, fully featured and used in thousands of successful projects.

DBUtil.java类:
package com.qianfeng.tools;

       官网介绍了Nhibernate是针对.NET框架的成熟的、开源的面向关系型数据库映射(ORM).

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class DBUtil {
static SessionFactory sf;
static {
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
sf = cfg.buildSessionFactory();
}
public static Session findsession() {
return sf.openSession();
}
public static void main(String[] args) {
//初始化Hibernaete.cfg.xml文件
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
//初始化SessionFactory工厂
SessionFactory sf = cfg.buildSessionFactory();
System.out.println(sf.openSession());
}
}

       或者使用VS2013附带的NuGet管理程序直接安装(NuGet,.NET下面一个开源的程序包管理工具):Install-Package Nhibernate(非常的快)

hibernate.cfg.xml文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>

澳门新浦京娱乐场网站 7

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/javaee</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

 

<property name="show_sql">true</property>

 

<property name="format_sql">true</property>

  1. 入门教程

<mapping resource="com/qianfeng/model/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

       新建一个项目NHOne和测试程序,并且添加对于该项目的测试项目,项目架构如下:

其中测试类中我使用的是JUnit5,因为负责人是JUnit4,所有我仔细审核了代码,发现代码是没有异样的,这里注意我使用的是被注释的HibernateTest类的@Before,故测试结果一直报User user=dao.selectById(1);这句空指针异常,我很奇怪,在这一句前面加了输出测试System.out.println(dao);发现dao为null;后面了解到原来是JUnit5中,初始化dao出错了,不应该用@Before,而应该用@BeforeAll,并且通过看@BeforeAll源码可以了解到该方法必须为静态,这就是JUnit5和JUnit4的区别之一。
所有我改掉之后
//UserDao dao;
/@Before
public static void init() {
dao=new UserDao();
}
/
static UserDao dao;
@BeforeAll
public static void init() {
dao=new UserDao();
}
结果就出来了:
Hibernate:
select
user0_.ID as ID0_0_,
user0_.USERNAME as USERNAME0_0_,
user0_.PASSWORD as PASSWORD0_0_,
user0_.GENDER as GENDER0_0_,
user0_.AGE as AGE0_0_,
user0_.ADDRESS as ADDRESS0_0_
from
JAVATEST user0_
where
user0_.ID=?
com.qianfeng.model.User@2638011
1,XXX,123

澳门新浦京娱乐场网站 8

 

 

划重点:其中对于Nhibernate的配置文件(hibernate.cfg.xml与ClassMapping文件,对于生成的操作,必须选择始终复制和嵌入式资源。(不然编译调试的时候会出现bug,比如没有Model Class的Mapping等等)。

  1. 测试项目详解

3.1     初始化C#解决方案NHOne(控制台应用程序和对应的测试项目)

       给每一个项目添加Nhibernate引用,测试项目也需要(直接NuGet命令安装即可)

3.2     编写NHibernate配置文件

       在NHOne的根目录下添加hibernate.cfg.xml文件(生成操作嵌入式资源和始终复制),在文档属性中架构选择hibernate-configuration-2.2 & hibernate-mapping-2.2两个文件,这样编写hibernate.cfg.xml就会有自动提示的功能(这两个文件在我们解决方案NHOne的packages/Nhibernate目录中)

 澳门新浦京娱乐场网站 9

 

hibernate.cfg.xml 具体内容如下:

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

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

  <session-factory>

    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

    <property name="connection.connection_string">Data Source=localhost;user=sa;password=12345;Initial Catalog=test</property>

    <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>

    <property name="show_sql">true</property>

    <property name="hbm2ddl.auto">update</property>

   

    <!--Mapping files 嵌入式资源 表格table 名字不可以是user-->

    <mapping  assembly="NHOne"/>

  </session-factory>

 

</hibernate-configuration>

 

<mapping assembly=”NHOne”/> 这里写的是项目的名字,然后就会搜寻项目下面所有的后缀是.hbm.xml的文件,也可以手动自己添加,比较麻烦,有机会再详细讲解。

3.3     编写Model Class “User”

         所有的属性都是使用virtual来修饰(延迟加载有用),添加对应的get set方法

         在MSServer 中,user 是关键字,因此不能够有user的表格,可以使用其他来代替

         在实际应用中,每一个model类,很可能需要提供Equals() HashCode() ToString()方法的重写

namespace NHOne.Model

{

    public class User

    {

        private string id;

        private string username;

        private string password;

        private char gender; //"F" & "M"

        private int age;

        private string phone;

 

        public User()

        {

 

        }

 

        public User(string username, string password, char gender, int age, string phone)

        {

            this.username = username;

            this.password = password;

            this.gender = gender;

            this.age = age;

            this.phone = phone;

        }

 

        public User(string id, string username, string password, char gender, int age, string phone)

        {

            this.id = id;

            this.username = username;

            this.password = password;

            this.gender = gender;

            this.age = age;

            this.phone = phone;

        }

        public virtual string Id { get; set; }

        public virtual string Username { get; set; }

        public virtual string Password { get; set; }

        public virtual char Gender { get; set; }

        public virtual int Age { get; set; }

        public virtual string Phone { get; set; }

        public override bool Equals(object obj)

        {

            if (this == obj)

            {

                return true;

            }

            User user = obj as User;

            if (user == null)

            {

                return false;

            }

            else

            {

                return this.Username.Equals(user.Username);

            }

        }

 

        public override int GetHashCode()

        {

            return Username.GetHashCode();

        }

 

        public override string ToString()

        {

            return "id:" Id ";  Username:" Username ";  Password:" Password ";  Gender:" Gender ";  Age:" Age ";    Phone:" Phone;

        }

    }

}

3.4  编写Model的Mapping文件

    位于Mapping目录下面新建文件User.hbm.xml文件(嵌入式资源,添加文件的架构为hibernate-mapping-2.2.xml),红色部分 assembly是项目的名称,namespace是在项目中Model类的命名空间,如果省略的话,需要在后面的class name属性中填写完整的名字空间和类名。

注意table的名字不能写成user,否则报错,因为user是数据库的关键字

内容如下:

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

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHOne" namespace="NHOne.Model" default-lazy="true">

  <class name="User" table="client">

    <id name="Id">

      <column name="user_id" sql-type="char(32)" not-null="true"/>

      <generator class="uuid.hex"/>

    </id>

    <property name="Username" column="username"  not-null="true"/>

    <property name="Password" column="password" not-null="true" />

    <property name="Gender"   column="gender"   />

    <property name="Age"      column="age"      />

    <property name="Phone"    column="phone"    />

  </class>

</hibernate-mapping>

 

3.5    编写NHibernate的帮助类,初始化NHibernate的环境,获取Session

       在Util命名空间下,添加YangNHibernate的类,具体内容如下:

namespace NHOne.Util

{

    public class YangNHibernate

    {

        private static readonly  ISessionFactory sessionFactory;

        private static string HibernateHbmXmlFileName = "hibernate.cfg.xml";

        //private static ISession session

        static YangNHibernate()

        {

            sessionFactory = new Configuration().Configure().BuildSessionFactory();

        }

        public static ISessionFactory getSessionFactory()

        {

            return sessionFactory;

        }

        public static ISession getSession()

        {

            return sessionFactory.OpenSession();

        }

澳门新浦京娱乐场网站:学科入门,hibernate开辟步骤。        public static void closeSessionFactory()

        {

            

        }

    }

}

 

3.6    编写测试代码

       在测试类中测试保存User到数据库,使用事务的机制

        [TestMethod]

        public void TestSaveUser()

        {

            User user = createUser();

            ISession session  = YangNHibernate.getSession();

            ITransaction tx = session.BeginTransaction();

            session.Save(user);

            tx.Commit();

            session.Close();

       

        }

 

调试程序:

澳门新浦京娱乐场网站 10

 

 

 

  1. 总结

       NHibernate是C#程序员,参照Java的ORM框架Hibernate实现的一个开源项目,在C#中项目开发中非常的便捷高效,让程序猿从复杂的SQL语句中解放出来,对于项目的模块化非常好用。

       测试项目的源代码地址:

                

参考文档:

  1. NHibernate官方网站
  2. MSDN for C#:

附:关联知识点

知识点1:C#静态构造函数

C#关于静态构造函数的知识,自动调用初始化静态的成员属性,尤其是readonly修饰的静态属性,与Java中的静态代码块类似。

参考MSDN给出的解释:

       A static constructor is used to initialize any static.aspx) data, or to perform a particular action that needs to be performed once only. It is called automatically before the first instance is created or any static members are referenced.

()

       因为静态构造函数是.NET自动调用的,因此改代码块就无需使用修饰符修饰。

关于C#静态构造函数的特征,具体如下:

       A static constructor does not take access modifiers or have parameters.

       A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced.

       A static constructor cannot be called directly.

       The user has no control on when the static constructor is executed in the program.

       A typical use of static constructors is when the class is using a log file and the constructor is used to write entries to this file.

       Static constructors are also useful when creating wrapper classes for unmanaged code, when the constructor can call the LoadLibrary method.

       If a static constructor throws an exception, the runtime will not invoke it a second time, and the type will remain uninitialized for the lifetime of the application domain in which your program is running.

 

知识点2:关于Visual Studio文件生成操作

Visual Studio生成操作有以下几个选项:

       Non(无):也就是在项目生成的时候不进行任何的操作,在生成的目录中没有此文件,一般用于项目描述文件.

       Content(内容):也就是将文件直接复制到输出目录中,一般用于html等静态文件.

       Compile(编译):编译代码文件,通常的代码文件需要编译

       Embedded Resource(嵌入式资源):将该文件作为DLL或可执行文件嵌入到主目录中,通常用于资源文件,比如Nhibernate的配置文件等等。

 

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:学科入门,hibernate开辟