`
maplye
  • 浏览: 114610 次
  • 来自: ...
社区版块
存档分类
最新评论

NHiernate中自定义Generator

    博客分类:
  • .NET
阅读更多

我的这个自定义的Generator设置如下:

<generator class="HYLQ.Core.Domain.StreamGenerator, HYLQ.Core">
        
<param name="ObjectName">Child</param>
      
</generator>
这样我会为每个ObjectName都会产生一个顺序的流水号。
StreamGenerator的代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using NHibernate.Id;
using NHibernate.Engine;
using NHibernate.SqlCommand;
using NHibernate.SqlTypes;
using NHibernate.Type;
using NHibernate.Util;
using NHibernate.Dialect;
using NHibernate.Mapping;

namespace HYLQ.Core.Domain
{
    
class StreamGenerator : IPersistentIdentifierGenerator, IConfigurable
    
{


        
/**//// <summary></summary>
        public const string ObjectNameTarget = "ObjectName";

        
public const string procNameTarget = "ProcedureName";

        
private string objectName;
        
private string procName = "usp_GetID";
        
private long next;

        
private System.Type returnClass;

        
/**//// <summary>
        
///
        
/// </summary>
        
/// <param name="type"></param>
        
/// <param name="parms"></param>
        
/// <param name="d"></param>


        
public void Configure(IType type, IDictionary parms, Dialect d)
        
{
            objectName 
= parms[ObjectNameTarget] as string;

            
if (parms[procNameTarget] != null)
            
{
                procName 
= parms[procNameTarget] as string;
            }


            returnClass 
= type.ReturnedClass;
        }


        
/**//// <summary>
        
///
        
/// </summary>
        
/// <param name="session"></param>
        
/// <param name="obj"></param>
        
/// <returns></returns>

        [MethodImpl(MethodImplOptions.Synchronized )]
        
public object Generate(ISessionImplementor session, object obj)
        
{
            
if (objectName != null)
            
{
                getNext(session);
            }

            
return IdentifierGeneratorFactory.CreateNumber(next, returnClass);
        }


        
private void getNext(ISessionImplementor session)
        
{

            SqlConnection conn 
= (SqlConnection)session.Factory.OpenConnection();
            SqlCommand qps 
= conn.CreateCommand();
            qps.CommandText 
= procName;
            qps.CommandType 
= CommandType.StoredProcedure;
            qps.Parameters.Add(
new SqlParameter("@ObjectName", SqlDbType.VarChar,10));
            qps.Parameters[
"@ObjectName"].Value = objectName;

            
try
            
{
                next 
= int.Parse(qps.ExecuteScalar().ToString());
                
            }

            
catch 
            
{
                
throw;
            }

            
finally
            
{
                session.Factory.CloseConnection( conn );
            }

        }


        
/**//// <summary>
        
///
        
/// </summary>
        
/// <param name="dialect"></param>
        
/// <returns></returns>

        public string[] SqlCreateStrings(Dialect dialect)
        
{
            
return new string[0];
        }


        
/**//// <summary>
        
///
        
/// </summary>
        
/// <param name="dialect"></param>
        
/// <returns></returns>

        public string SqlDropString(Dialect dialect)
        
{
            
return null;
        }


        
/**//// <summary></summary>
        public object GeneratorKey()
        
{
            
return objectName;
        }

    }

}

这里是调用一个存储过程来生成流水号的。
存储过程和表的定义如下:
--流水号
create table Stream
(
    ObjectName        
varchar(10)        not null,        --对象名
    MaxID            int                not null,        --流水号
    primary key(ObjectName)
)
go

--流水号发生器
if exists(select * from sysobjects where type='p' and name='usp_GetID')
    
drop proc usp_GetID
go
create proc usp_GetID
(
    
@ObjectName        varchar(10)            --对象名
)
as
begin
    
declare @MaxID int
    
SET NOCOUNT ON

    
if exists(select * from Stream where ObjectName=@ObjectName)
    
begin
        
select @MaxID=MaxID from Stream where ObjectName=@ObjectName
        
update Stream set MaxID=MaxID+1 where ObjectName=@ObjectName
    
end
    
else
    
begin
        
set @MaxID=1
        
insert into Stream values(@ObjectName,2)
    
end
    
    
select @MaxID as MaxID
end
go

希望对大家能有所帮助!

分享到:
评论

相关推荐

    MyBatis Generator自定义插件实现自定义Mapper

    在MyBatis Generator的配置文件(如`generatorConfig.xml`)中,我们需要声明并启用自定义插件。指定插件类全名,并配置任何所需的属性。 ```xml &lt;!-- 配置插件属性 --&gt; ``` 4. **自定义Mapper** ...

    mybatis generator 自定义注释生成

    在“mybatis generator 自定义注释生成”这个主题中,我们主要关注的是如何在生成的代码中添加自定义的注释,特别是支持中文的表字段注释。这对于后期的代码维护和团队协作至关重要,清晰的注释能帮助理解代码逻辑,...

    自定义mybatis-generator生成jar包

    在Java开发中,MyBatis Generator(MBG)是一个强大的工具,它能够自动化地生成MyBatis相关的代码,包括Mapper接口、Mapper XML文件、DAO实现类、Service接口及实现、Controller以及实体类等。自定义MBG可以帮助我们...

    mybatis-generator 1.3.5 源码+改进+支持自定义文件后缀+表、字段注释

    在1.3.5版本中,它已经得到了一些改进,特别是增加了对自定义文件后缀的支持以及为数据库表和字段添加注释的功能。这个压缩包包含的是MGB的源码,用户可以根据自己的需求进行定制和扩展。 MyBatis Generator的核心...

    springboot集成generator自定义插件.rar

    在这个"springboot集成generator自定义插件.rar"项目中,我们看到的重点是如何在Spring Boot项目中集成MyBatis Generator,并且自定义注释。这通常涉及到以下几个关键知识点: 1. **Spring Boot与MyBatis集成**:...

    自定义注释的mybatis-generator-core-1.3.6.jar

    在本例中,我们关注的是`mybatis-generator-core-1.3.6.jar`,这是一个包含自定义注释功能的版本,能够生成带有表字段注释的实体类。这在开发过程中极大地提高了效率,因为手动编写这些注释既耗时又容易出错。 ...

    mybatis中的generator工具

    在本篇文章中,我们将深入探讨MyBatis Generator的使用方法、主要功能以及如何结合MyBatis框架来提升开发效率。 一、MyBatis Generator简介 MyBatis Generator是一个基于Java的代码生成器,它能够根据数据库表结构...

    Mybatis Generator model 自定义配置

    1 如果不改直接使用,把其中.class 文件放到自己jar包所在配置位置找到 mybatis-generator-core.1.xx.xx.jar 用压缩工具打开 plugins 目录中 如果自己想改,可以.java 放在自己项目中,编辑好,再使用编译好的对应的...

    mybatis+freemake自定义代码生成文件CodeGenerator.zip

    "mybatis+freemake自定义代码生成文件CodeGenerator.zip" 提供了一个自定义代码生成器,它超越了常规的只生成Mapper、Service和Model的局限,扩展了更多的可能性。 Mybatis是一个流行的Java持久层框架,它简化了...

    mybatis逆向工具generator,中文注释,Byte改Integer

    MyBatis Generator是一款强大的逆向工程工具,它能够根据数据库中的表自动生成对应的Java实体类、Mapper接口和XML配置文件,极大地提高了开发效率。在给定的标题中,“mybatis逆向工具generator,中文注释,Byte改...

    mybatis-generator-core-1.3.2 自动生成文件

    6. **插件机制**:MyBatis Generator支持插件,开发者可以通过编写插件来扩展其功能,比如添加自定义的代码生成逻辑。 7. **版本控制**:生成的代码应纳入版本控制系统(如Git),这样团队成员可以协作开发,并确保...

    vue-ele-form-generator可视化表单设计工具 v3.1.0.zip

    在毕业设计论文中,"vue-ele-form-generator"可以作为一个实际应用案例,用于探讨前端开发中的动态表单生成技术,或者研究如何通过可视化工具提高软件开发效率。学生可以分析其架构设计,探讨组件化、模块化的实现...

    Mybatis-Plus自定义模板,生成标准的单表增删改查分页等代码

    - 配置Mybatis-Plus:在mybatis-plus-generator.properties或YML配置文件中指定自定义模板的位置和名称。 - 生成代码:运行代码生成器,Mybatis-Plus将根据模板生成相应的Java代码。 5. **扩展性**: Mybatis-...

    mybatis-generator-core-1.3.7-API文档-中文版.zip

    赠送jar包:mybatis-generator-core-1.3.7.jar; 赠送原API文档:mybatis-generator-core-1.3.7-javadoc.jar; 赠送源代码:mybatis-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    一个简单的自定义ID 生成器IDGenerator

    一个用Java 编写简单的自定义ID 生成器IDGenerator

    LR-Virtual_User_Generator完全中文使用说明

    3. **脚本语言**:LoadRunner使用VU Generator(VuGen)中的内置脚本语言——Vuser Language(VuScript)。VuScript类似于C语言,允许用户自定义函数和变量,进行条件判断和循环控制。 4. **参数化**:为了模拟真实...

    form-generator项目集成方案.doc

    在引入form-generator项目时,需要复制form-generator项目的components文件夹下的全部文件、uits文件夹下的所有文件以及views文件夹下全部文件到自己项目中,styles文件夹下全部文件复制到自己工程,icons文件夹下...

    Node.js-在Express中愉快地使用Generator

    本文将深入探讨如何在Express中愉快地使用Generator,以实现更优雅的异步控制流。 Generator函数是JavaScript中的一个特殊函数,其特征是在函数声明前加上`function*`关键字。Generator函数可以暂停和恢复执行,...

    整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件

    在Java开发中,Maven、MyBatis和Generator是三个重要的工具。Maven是一个项目管理工具,用于构建、管理和依赖管理;MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射;而Generator则是MyBatis...

    Msc-generator使用手册

    Msc-generator是一款用于从文本描述中绘制各种图表的工具,它的版本为6.1.0,更新于2017年11月3日。这款工具可以生成多种类型的图表,包括信号图、流程图、块图等,每种图表都有其特定的用途和特点。为了更好地理解...

Global site tag (gtag.js) - Google Analytics