Spring.NET 整合Nhibernate
因为最近无意中学了AOP ,所以想一探究竟,看看.net里这个Spring.Net 到底是怎么回事,请有需要的童鞋往下,不需要的请alt+w。因为是先配置的 Nhibernate 所以就从这个开始。开发环境:VS2012
1. 下载Nhibernate 我这里用的是 NHibernate-3.3.2.GA-bin
2. 添加映射文件 *.hbm.xml 当然 你可以使用映射或者其他一些方式 不过这个比较常用 需要注意的地方有如下几点:
1.这个映射文件需要在属性中设置为 嵌入的资源,如果丢了这一步 可能会异常。
2. 在映射文件里, 程序集以及命名空间很重要。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="TestNHISpringIntegral.Core" namespace="TestNHISpringIntegral.Core.Model">
这个对应的是model的。
3. 列名一定要对应上,主键外键这些的设置也要注意,在这里就不再赘述。 例子如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="TestNHISpringIntegral.Core" namespace="TestNHISpringIntegral.Core.Model"> <class name="Author" table="Authors" lazy="false" >
<cache usage="read-write"/>
<id name="Id" column="Id" type="Int32">
<generator class="identity"/>
</id>
<property name="FirstName" length="50" type="String" column="FirstName" />
<property name="LastName" length="50" type="String" column="LastName" /> </class>
</hibernate-mapping>
3.添加 NHibernate 配置文件 从配置模板里复制出对应的配置文件,我这里是sql2005,请童鞋参照自己的数据库进行设置,注意 将此文件放到bin里面,这样方便读取,还要在app.config 或者web.config 里设置下section,因为顺序是先单独配置,然后进行整合所以可能在后续的内容里会重新设置,请童鞋注意。section 必须是放在最前面 否则依然会报错
1.在app.config 或者web.config里添加如下内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
</configuration>
2.修改数据库相关配置:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.connection_string">Server=.\SQLEXPRESS;Database=BookDemo;Integrated Security=SSPI</property> <!--<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="adonet.batch_size">10</property>
<property name="show_sql">false</property>
<property name="use_outer_join">true</property>
<property name="command_timeout">60</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Spring.ProxyFactoryFactory, NHibernate.ByteCode.Spring</property>--> <!-- mapping files 关键配置,否则出异常:No persister for -->
<mapping assembly="TestNHISpringIntegral.DAO" />
</session-factory>
</hibernate-configuration>
上面注释掉的内容都是在配置完成之后正式使用的时候才需要的内容,所以我这里全部注释掉了。
4.到这里 NHibernate 就配置完成了,童鞋们可以写代码自己测试下 我的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg; namespace TestNhibreateWithConsole
{
public class ConfigurationHelper
{
private Configuration _config; private static ISessionFactory _sessionFactory;
public ConfigurationHelper()
{
_config=new Configuration();
} private ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
_config= new Configuration().Configure();
_sessionFactory = _config.BuildSessionFactory();
}
return _sessionFactory;
}
}
public ISession OpenSession()
{
return SessionFactory.OpenSession();
} }
}
页面上如下:
static void Main(string[] args)
{
using (var sessionFactory = new ConfigurationHelper().OpenSession())
{ var user = sessionFactory.CreateCriteria<R.Books>();
var auList = user.List<R.Books>();
auList.ToList().ForEach(au => Trace.WriteLine(au.Publisher)); } }
忘记说明一点 因为这个NHibernate 依赖其他程序集 请一并进行引用。到这里NHibernate 配置就完成了,下面是spring.net 的配置
5. 引用spring.net 相关程序集,因为我这里是使用的web测试的 所以将一些文件都分开了,我的文件目录如图:
6.各个程序集的配置以及使用,我将分步描述
1.在DAO里面添加Mapping,并添加映射文件。
2.在core里面添加model 并且添加相应的类,注意 这里spring 使用的是castle 所以记住一定要用virtual 修饰 例子如下
using System; namespace TestNHISpringIntegral.Core.Model
{
[Serializable]
public class Author
{
public virtual Int32 Id { get; set; }
public virtual String FirstName { get; set; }
public virtual String LastName { get; set; }
}
}
3.添加IRepository 泛型类 所有的实体都将继承这个。 代码如下
public interface IRepository<T>
{
void Delete(T entity);
T Get(object id);
object Save(T entity);
void Update(T entity);
}
4.使用泛型Repository模式,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Spring.Data.NHibernate.Support; namespace TestNHISpringIntegral.Core
{
public class NHibernateRepository<T> : Spring.Data.NHibernate.Generic.Support.HibernateDaoSupport,IRepository<T>
{
public object Save(T entity)
{
// return Spring.Data.NHibernate.Generic.HibernateTemplate
return this.HibernateTemplate.Save(entity);
} public T Get(object id)
{
return HibernateTemplate.Get<T>(id); } public void Update(T entity)
{
HibernateTemplate.Update(entity);
} public void Delete(T entity)
{
HibernateTemplate.Delete(entity);
}
}
}
可能出现的问题以及解决方法,这里的HibernateTemplate 需要引用Spring.Data.NHibernate32 程序集,请注意继承的接口不是Spring.Data.NHibernate.Support 这个命名空间下的,如果这里忽视可能会出 TypeMismatchException: Cannot convert property value of type[Spring.Data.NHibernate.HibernateTemplate] to required type [Spring.Data.NHibernate.Generic.HibernateTemplate] for property ... Spring.Data.NHibernate.Generic.HibernateTemplate Spring.Data.NHibernate.HibernateTemplate-
这个错误是第一个,第二 可能在
public T Get(object id)
{
return HibernateTemplate.Get<T>(id); }
这个代码处会出现错误,如果童鞋遇到请参考我说的不同命名空间导致的问题,如果不对的话这个地方应该是提供两个参数,我配置的时候也曾在这个地方改过,后来因为程序集转换的时候改了命名空间所以这个就改回去了
5. 添加xml配置文件 我的配置文件如下 这里主要是一个数据库的连接配置,因为这里由spring 接管所以需要这个配置,我的配置如下
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:db="http://www.springframework.net/database">
<!-- 用以我们在其它的应用程序中,配置数据访问 -->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object> <!-- 数据库和Nhibernate的相关配置 -->
<db:provider id="DbProvider" provider="SqlServer-2.0"
connectionString="Server=${db.datasource};database=${db.database};uid=${db.user};pwd=${db.password};"/> <!--SessionFactory对象,其中包括一些比较重要的属性 -->
<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate32">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<!--<value>Model</value>-->
<value>TestNHISpringIntegral.DAO</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
<entry key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
<entry key="use_outer_join" value="true"/>
<entry key="show_sql" value="false"/>
<!--自动建表(反向映射)-->
<entry key="hbm2ddl.auto" value="update"/>
<entry key="adonet.batch_size" value=""/>
<entry key="command_timeout" value=""/>
<!--显式启用二级缓存-->
<entry key="cache.use_second_level_cache" value="true"/>
<!--启动查询缓存-->
<entry key="cache.use_query_cache" value="false"/>
<entry key="query.substitutions" value="true 1, false 0, yes 'Y', no 'N"/>
<!--<entry key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle"/>-->
</dictionary>
</property>
<property name="ExposeTransactionAwareSessionFactory" value="true" />
</object> <object id="HibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object> <object id="repository.Author" type="TestNHISpringIntegral.Core.NHibernateRepository<TestNHISpringIntegral.Core.Model.Author>,TestNHISpringIntegral.Core">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object> </objects>
可能会出现的问题
1. modle 那里是映射文件所在程序集 请正确配置
2.数据库的不一样导致provider也不一样,不同的数据库有不同的配置,比如原来我的是
<db:provider id="DbProvider" provider="SqlServerCe-3.1" connectionString="Server=${db.datasource};Initial Catalog=${db.database};Integrated Security=SSPI;"/>
但是spring 加载的时候始终提示未识别的关键字Server 这里是因为我的provider 配置错误导致的 正确的 请参考上面的配置文件,我的数据库是sql2005。
3.这里的${db.datasource};是占位符一样的东西,在后面由app.config 或者webconfig传入,请童鞋清楚。
<object id="repository.Author" type="TestNHISpringIntegral.Core.NHibernateRepository<TestNHISpringIntegral.Core.Model.Author>,TestNHISpringIntegral.Core">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>
这里的<也许让你很奇怪是不是格式错误,因为这里使用的是泛型的 Repository 所以被加载后实际上是 NHibernateRepository<Model.Author>了,请童鞋对此不必惊慌 注意这里的程序集一定要配置程序集正确 不然会引起 1.System.TypeLoadException: Could not load type from string value'xxxxxx' 2.无法从程序集'xxxxx'加载某个方法。如果这两个问题都没有出现 报告程序集转换错误的问题,请看前面关于这个错误的具体解决方法,就是命名空间的问题
6.添加bll
1.添加接口,我这里代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using TestNHISpringIntegral.Core;
using System.Text;
using M=TestNHISpringIntegral.Core.Model; namespace TestNHISpringIntegral.Bll
{
public interface IAuthor
{
void Delete(M.Author entity);
M.Author Get(object id);
object Save(M.Author entity);
void Update(M.Author entity);
IRepository<M.Author> AuthorRepository { get; set; }
}
}
2.实现接口 代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TestNHISpringIntegral.Core;
using M=TestNHISpringIntegral.Core.Model; namespace TestNHISpringIntegral.Bll
{
public class Author:IAuthor
{
public IRepository<M.Author> AuthorRepository { get; set; }
public void Delete(M.Author entity)
{
AuthorRepository.Delete(entity); } public M.Author Get(object id)
{
return AuthorRepository.Get(id);
} public object Save(M.Author entity)
{
return AuthorRepository.Save(entity);
} public void Update(M.Author entity)
{
AuthorRepository.Update(entity);
}
}
}
3.添加配置文件 我的配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"> <object id="transactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
</object> <object id="transactionInterceptor" type="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data">
<property name="TransactionManager" ref="transactionManager"/>
<property name="TransactionAttributeSource">
<object type="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data"/>
</property>
</object> <object id="BaseTransactionManager" type="Spring.Transaction.Interceptor.TransactionProxyFactoryObject, Spring.Data" abstract="true">
<property name="PlatformTransactionManager" ref="transactionManager"/>
<property name="TransactionAttributes">
<name-values>
<add key="Save*" value="PROPAGATION_REQUIRED"/>
<add key="Set*" value="PROPAGATION_REQUIRED"/>
<add key="Finish*" value="PROPAGATION_REQUIRED"/>
<add key="Update*" value="PROPAGATION_REQUIRED"/>
<add key="Delete*" value="PROPAGATION_REQUIRED"/>
<add key="Add*" value="PROPAGATION_REQUIRED"/>
<add key="Get*" value="PROPAGATION_SUPPORTS,readOnly"/>
<add key="Find*" value="PROPAGATION_SUPPORTS,readOnly"/>
<add key="Load*" value="PROPAGATION_SUPPORTS,readOnly"/>
<add key="*" value="PROPAGATION_REQUIRED"/>
</name-values>
</property>
</object> <object id="AuthorManager" parent="BaseTransactionManager">
<property name="Target">
<object type="TestNHISpringIntegral.Bll.Author,TestNHISpringIntegral.Bll">
<property name="AuthorRepository" ref="repository.Author"/>
</object>
</property>
</object> </objects>
这部分代码我是从之前别人的东西里扒出来的,稍稍修改了下,请童鞋根据自己的东西进行修改,需要特别注意的是这里的配置文件都要在属性里设置为嵌入的资源
7.测试最终结果此时的配置文件
<?xml version="1.0" encoding="utf-8"?> <!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
--> <configuration> <configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
</sectionGroup> <section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
</parsers>
<context>
<resource uri="assembly://TestNHISpringIntegral.Core/TestNHISpringIntegral.Core/Repository.xml"/>
<resource uri="assembly://TestNHISpringIntegral.Bll/TestNHISpringIntegral.Bll/Manager.xml"/>
</context> </spring> <log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %logger - %message%newline" />
</layout>
</appender> <!-- Set default logging level to DEBUG -->
<root>
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
</root> <!-- Set logging for Spring. Logger names in Spring correspond to the namespace -->
<logger name="Spring">
<level value="INFO" />
</logger> <logger name="Spring.Data">
<level value="DEBUG" />
</logger> <logger name="NHibernate">
<level value="INFO" />
</logger> </log4net>
<databaseSettings>
<add key="db.datasource" value=".\SQLEXPRESS" />
<add key="db.database" value="BookDemo" />
<add key="db.user" value="sa"/>
<add key="db.password" value=""/>
</databaseSettings> <!--<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.3.1.4000" newVersion="3.3.1.4000" /> </dependentAssembly> </assemblyBinding> </runtime>--> </configuration>
里面的程序集
<context>
<resource uri="assembly://TestNHISpringIntegral.Core/TestNHISpringIntegral.Core/Repository.xml"/>
<resource uri="assembly://TestNHISpringIntegral.Bll/TestNHISpringIntegral.Bll/Manager.xml"/>
</context>
对应的是前面添加的配置文件,请配置正确,否则也会报错跑不起来,这里因为我忘记具体的错误了,所以只是提醒大家注意这里,这样整个就贯穿起来了。
页面代码:
log4net.Config.XmlConfigurator.Configure();
IApplicationContext applicationContext = ContextRegistry.GetContext();
authorManager = (IAuthor)applicationContext.GetObject("AuthorManager");
var authorM=authorManager.Get(2);
Response.Write(authorM.FirstName+"^^^^^^^");
到此全部完成,至于MVC 只是调用所以就没写上来,大家自己去整合,如果有问题请留言大家一起探讨,不喜勿喷。
Spring.NET 整合Nhibernate的更多相关文章
- 六步实现Spring.NET 与 NHibernate 的整合
最近刚完成一个项目,其中对数据库的架构用到的是Spring.NET 与 NHibernate相结合的产物.对于这两项技术,我自己也不是太熟悉,不过好在网上有很多关于这方面的介绍文档,在这里就不多说了. ...
- Spring.NET 与 NHibernate
回到 Spring.NET & NHibernate of C#.NET 技术论坛 实战C#.NET编程----Spring.NET & NHibernate从入门到精通 您可以从以下 ...
- ASP.NET MVC Spring.NET 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- struts2 spring mybatis 整合(test)
这几天搭了个spring+struts2+mybatis的架子,练练手,顺便熟悉熟悉struts2. 环境:myEclipse10+tomcat7+jdk1.6(1.8的jre报错,所以换成了1.6) ...
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...
- 3.springMVC+spring+Mybatis整合Demo(单表的增删该查,这里主要是贴代码,不多解释了)
前面给大家讲了整合的思路和整合的过程,在这里就不在提了,直接把springMVC+spring+Mybatis整合的实例代码(单表的增删改查)贴给大家: 首先是目录结构: 仔细看看这个目录结构:我不详 ...
- 由“单独搭建Mybatis”到“Mybatis与Spring的整合/集成”
在J2EE领域,Hibernate与Mybatis是大家常用的持久层框架,它们各有特点,在持久层框架中处于领导地位. 本文主要介绍Mybatis(对于较小型的系统,特别是报表较多的系统,个人偏向Myb ...
- spring+websocket整合
java-websocket的搭建非常之容易,没用框架的童鞋可以在这里下载撸主亲自调教好的java-websocket程序: Apach Tomcat 8.0.3+MyEclipse+maven+JD ...
- Hibernate 与 Spring 的整合
刚刚学习了hibernate和Spring的整合,现在来总结一下. 以实现一个功能为例,与大家分享一下整个过程. 需要实现的功能:建立一个Person类,该类包括name,sex,age,birtha ...
随机推荐
- [Z] 将samba共享文件夹映射到linux的目录下
Linux系统下访问远程共享资源 使用mount加载共享目录: -把WinXP机器192.168.16.249上的共享目录test001映射到本地目录/wdl/下. -把Linux机器192.168. ...
- 关于电机驱动扩展板 L293D 马达板Arduino
注意端口3,4,5,6,7,8,9,10,11,12会被占用(板子上的pin口). 通过 MS_DCMotor motor(4); 中的4指的是4号电机,同理还有1-3号电机.不是pin口 舵机用 ...
- Python基础学习八 写日志
import logging from logging import handlers class Logger(object): level_relations = { 'debug': loggi ...
- CentOS6上安装Flash Player
Linux CentOS6服务器中的某个需要远程操作的项目需要使用到Adobe Flash Player组件,直接通过YUM方式安装不了,于是通过强大的搜索,还是可以解决到安装方法的,通过重新加载安装 ...
- CodeFirst(反射+特性)
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- python中heapq堆的讲解
堆的定义: 堆是一种特殊的数据结构,它的通常的表示是它的根结点的值最大或者是最小. python中heapq的使用 列出一些常见的用法: heap = []#建立一个常见的堆 heappush(hea ...
- 服务器意外重启导致storm报错的问题处理
解决方法 cat /opt/storm-0.8.2/conf/storm.yaml中找到storm.local.dir设定的目录,备份supervisor和workers两个文件夹,#nohup su ...
- kubernetes role
https://kubernetes.io/docs/admin/authorization/rbac/
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十周
---恢复内容开始--- Java学习第十周 本周,学习泛型程序设计,泛型也被称为参数化类型(parameterized type),就是在定义类.接口和方法时,通过类型参数指示将要处理的 ...
- C# Common Keyword II
[C# Common Keyword II] 1.as 运算符用于在兼容的引用类型之间执行某些类型的转换. class csrefKeywordsOperators { class Base { pu ...