NHIbernate学习之旅【四】——非查询及事务
2010-05-04 10:24
316 查看
这篇讲非查询及事务,通过前面几章学习,我们都读NHibernate有了一定了解,多数操作都是通过ISESSION进行的,非查询也不例外。
我们还是在原来的项目上扩展。非查询主要包括增删改,NHibernate通过以下方法进行:
_session.Save(customer); //添加一条新的customer数据。
_session.Update(customer); //修改customer数据
_session.Delete(customer); //删除customer数据
事务通过ITransaction来执行,代码如下:
ITransaction tx = _session.BeginTransaction();
//一些保存、更新、删除等操作
tx.Commit();
用到事务时,最好加上Using(){} ,以便用完后自动清理内存;
代码
using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernateSample.Domain.Entities;
namespace NHibernateSample.Data
{
public class CRUD
{
private ISession _session;
private SessionManager _helper;
public CRUD()
{
_helper = new SessionManager();
_session = _helper.GetSession();
}
/// <summary>
/// 根据ID返回CUSTOMER对象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Customer GetCustomerById(int id)
{
return _session.Get<Customer>(id);
}
/// <summary>
/// 添加新的Customer
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public int CreateCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
int newid = 0;
try
{
newid = (int)_session.Save(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
newid = 0;
tx.Rollback();
}
return newid;
}
}
/// <summary>
/// 删除Customer
/// </summary>
/// <param name="customer"></param>
public void DeleteCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Delete(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
}
}
/// <summary>
/// 修改Customer
/// </summary>
/// <param name="customer"></param>
public void UpdateCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Update(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
}
}
}
}
然后再在UI进行调用即可,以上代码测试通过。
有人可能注意到了_session.Flush();,之所以每次执行完药用_session.Flush();是因为ISESSION中保存的是内存中的数据,如果不同步Session的话,那么原来调用的Session保存的是修改数据库数据之前的数据。只有调用了Flush()函数才跟数据库的数据同步。
最后,关于非查询中还有一个特殊的方法,ISession.SaveOrUpdate(object)方法,看字面意思就知道,保存或者更新,通过这个方法NHibernate可以自动判断数据时要保存还是更新,如果数据存在则更新,否则添加,代码就不写了,感兴趣的自己试试。
~本篇END
我们还是在原来的项目上扩展。非查询主要包括增删改,NHibernate通过以下方法进行:
_session.Save(customer); //添加一条新的customer数据。
_session.Update(customer); //修改customer数据
_session.Delete(customer); //删除customer数据
事务通过ITransaction来执行,代码如下:
ITransaction tx = _session.BeginTransaction();
//一些保存、更新、删除等操作
tx.Commit();
用到事务时,最好加上Using(){} ,以便用完后自动清理内存;
代码
using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernateSample.Domain.Entities;
namespace NHibernateSample.Data
{
public class CRUD
{
private ISession _session;
private SessionManager _helper;
public CRUD()
{
_helper = new SessionManager();
_session = _helper.GetSession();
}
/// <summary>
/// 根据ID返回CUSTOMER对象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Customer GetCustomerById(int id)
{
return _session.Get<Customer>(id);
}
/// <summary>
/// 添加新的Customer
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public int CreateCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
int newid = 0;
try
{
newid = (int)_session.Save(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
newid = 0;
tx.Rollback();
}
return newid;
}
}
/// <summary>
/// 删除Customer
/// </summary>
/// <param name="customer"></param>
public void DeleteCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Delete(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
}
}
/// <summary>
/// 修改Customer
/// </summary>
/// <param name="customer"></param>
public void UpdateCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Update(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
}
}
}
}
然后再在UI进行调用即可,以上代码测试通过。
有人可能注意到了_session.Flush();,之所以每次执行完药用_session.Flush();是因为ISESSION中保存的是内存中的数据,如果不同步Session的话,那么原来调用的Session保存的是修改数据库数据之前的数据。只有调用了Flush()函数才跟数据库的数据同步。
最后,关于非查询中还有一个特殊的方法,ISession.SaveOrUpdate(object)方法,看字面意思就知道,保存或者更新,通过这个方法NHibernate可以自动判断数据时要保存还是更新,如果数据存在则更新,否则添加,代码就不写了,感兴趣的自己试试。
~本篇END
相关文章推荐
- 一步步学习NHibernate(9)——连接查询和子查询(1)
- SQL查询艺术学习笔记--SQL事务处理 隔离 锁 与 并发操作
- oracle 合并查询 事务 sql函数小知识学习
- NHibernate系列学习(三)-条件查询Criteria
- Oracle 11g 学习五:子查询,数据更新操作,事务处理和数据伪列
- NHibernate学习 第六天 NHibernate 中的查询
- 一步步学习NHibernate(10)——连接查询和子查询(2)
- NHibernate3.2学习笔记-几种查询方式
- 一步步学习NHibernate(8)——HQL查询(2)
- oracle 合并查询 事务 sql函数小知识学习
- JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
- Nhibernate系列学习之(三) Criteria查询表达式增删改查
- NHIbernate学习之旅【六】——关系查询
- NHibernate 事务查询的更新事件
- 《Redis设计与实现》学习笔记-发布与订阅、事务、慢查询日志
- oracle学习之四(合并查询,事务和部
- 一步步学习NHibernate(7)——HQL查询(1)
- Spring学习(十五)-事务的其他属性
- 学习Jquery EasyUI的添加,修改,删除,查询等基本操作
- 分布式事务的简单学习