Spring动态加载Hibernate映射文件
- 格式:doc
- 大小:29.50 KB
- 文档页数:2
SpringMVC+Spring+Hibernate框架整合原理,作⽤及使⽤⽅法SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层使⽤spring MVC负责请求的转发和视图管理spring实现业务对象管理,mybatis作为数据对象的持久化引擎原理:SpringMVC:1.客户端发送请求到DispacherServlet(分发器)2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller3.Controller调⽤业务逻辑处理后,返回ModelAndView4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图5.视图负责将结果显⽰到客户端Spring:我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们中的类,当然也包括service dao⾥⾯的),有了这个机制,我们就不⽤在每次使⽤这个类的时候为它初始化,很少看到关键字new。
另外spring的aop,事务管理等等都是我们经常⽤到的。
Mybatis:mybatis是对jdbc的封装,它让数据库底层操作变的透明。
mybatis的操作都是围绕⼀个sqlSessionFactory实例展开的。
mybatis通过配置⽂件关联到各实体类的Mapper⽂件,Mapper⽂件中配置了每个类对数据库所需进⾏的sql语句映射。
在每次与数据库交互时,通过sqlSessionFactory拿到⼀个sqlSession,再执⾏sql命令。
使⽤⽅法:要完成⼀个功能:1. 先写实体类entity,定义对象的属性,(可以参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。
2. 写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进⾏的那些操作,⽐如 insert、selectAll、selectByKey、delete、update等。
Hibernate+Spring多数据库解决方案我以前在项目中的探索和实践,写出来与大家分享。
大家有其他好的方式,也欢迎分享。
环境:JDK 1.4.x , Hibernate 3.1, Spring 2.0.6, JBOSS4.0, 开发模式: Service + DAO我们项目中需要同时使用多个数据库. 但 Hibernate 不能直接支持,为此我们对比了网上网友的方案,自己做了一点探索。
1. Demo需求我们的项目使用一个全省的公共库加十多个地市库的架构。
本文主要说明原理,将需求简化为两库模型。
主库:User管里,主要是系统管理,鉴权等数据;订单库:Order 管理,存放订单等业务性数据。
2. 原理:1) Hibernate 的每个配置文件对应一个数据库,因此多库需要做多个配置文件。
本文以两个为例:主库 hibernate_sys.cfg.xml,订单库 hibernate_order.cfg.xml每个库,Hibernate 对应一个 sessionFactory 实例,因此Hibernate 下的多库处理,就是在多个 sessionFactory 之间做好路由。
2) sessionFactory 有个 sessionFactory.getClassMetadata(voClass) 方法,返回值不为空时,表示该 VO 类在该库中(hbm.xml文件配置在了对应的hibernate.cfg.xml中),该方法是数据路由的核心和关键所在。
因此, User.hbm.xml 配置在 hibernate_sys.cfg.xml ,Order数据位于配置到 hibernate_order.cfg.xml3)多库处理时,需要使用 XA 事务管理。
本例中使用 Jboss4.0 来做JTA事务管理;用JOTM,其他应用服务器原理相同。
3. 实现1)为做多 sessionFactory 实例的管理,设计 SessionFactoryManager 类,功能就是做数据路由,控制路由的核心是 sessionFactoryMap 属性,它按dbFlag=sessionFactory 的方式存储了多个库的引用。
hibernate的基本用法Hibernate是一个开源的Java框架,用于简化数据库操作。
它为开发人员提供了一个更加简单、直观的方式来管理数据库,同时也提高了应用程序的性能和可维护性。
本文将逐步介绍Hibernate的基本用法,包括配置、实体映射、数据操作等。
一、配置Hibernate1. 下载和安装Hibernate:首先,我们需要下载Hibernate的压缩包并解压。
然后将解压后的文件夹添加到Java项目的构建路径中。
2. 创建Hibernate配置文件:在解压后的文件夹中,可以找到一个名为"hibernate.cfg.xml"的文件。
这是Hibernate的主要配置文件,我们需要在其中指定数据库连接信息和其他相关配置。
3. 配置数据库连接:在"hibernate.cfg.xml"文件中,我们可以添加一个名为"hibernate.connection.url"的属性,用于指定数据库的连接URL。
除此之外,还需要指定数据库的用户名和密码等信息。
4. 配置实体映射:Hibernate使用对象关系映射(ORM)来将Java类映射到数据库表。
我们需要在配置文件中使用"mapping"元素来指定实体类的映射文件。
这个映射文件描述了实体类与数据库表之间的对应关系。
二、实体映射1. 创建实体类:我们需要创建一个Java类,用于表示数据库中的一行数据。
这个类的字段通常与数据库表的列对应。
同时,我们可以使用Hibernate提供的注解或XML文件来配置实体的映射关系。
2. 创建映射文件:可以根据个人喜好选择使用注解还是XML文件来配置实体类的映射关系。
如果使用XML文件,需要创建一个与实体类同名的XML文件,并在其中定义实体类与数据库表之间的映射关系。
3. 配置实体映射:在配置文件中,我们需要使用"mapping"元素来指定实体类的映射文件。
spring4.x + hibernate4.x 配置详解关于spring和hibernate的使用以及特征等等,在此不再啰嗦,相信大家也都知道,或者去搜索一下即可。
本篇博文的内容主要是我最近整理的关于spring4.x 和hibernate 4.x 相关配置和使用方式,当然spring3.x以及hibernate4.x也可以借鉴。
首先是配置文件web.xml 增加以下代码即可<!-- 加载spring相关的配置文件--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/applicationContext.xml</param-value> </context-param><!-- 启用spring监听--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</l istener-class></listener>然后建立 applicationContext.xml 文件,src下。
文件内容如下,注释我尽量写的很详细<beans xmlns:xsi="/2001/XMLSchema-instance"xmlns="/schema/beans"xmlns:aop="http://ww /schema/aop"xmlns:context="/schema/context"xmlns:tx="ht tp:///schema/tx"xmlns:cache="/schema/cache"xmlns:p="http:// /schema/p"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.0.xsd/schema/aop/schema/aop/spring-aop-4.0.xsd/schema/context/schema/context/spring-context-4.0.xsd/schema/tx/schema/tx/spring-tx-4.0.xsd/schema/cache http://www.springframewor /schema/cache/spring-cache-4.0.xsd"><!-- 引入properties文件--><context:property-placeholder location="classpath*:/appConfig.properties"/> <!-- 定义数据库连接池数据源bean destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用--> <bean id="dataSource"class="boPooledDataSourc e"destroy-method="close"><!-- 设置JDBC驱动名称--><property name="driverClass"value="${jdbc.driver}"/><!-- 设置JDBC连接URL --><property name="jdbcUrl"value="${jdbc.url}"/><!-- 设置数据库用户名--><property name="user"value="${ername}"/><!-- 设置数据库密码--><property name="password"value="${jdbc.password}"/><!-- 设置连接池初始值--><property name="initialPoolSize"value="5"/></bean><!-- 配置sessionFactory --><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><!-- 数据源--><property name="dataSource"ref="dataSource"/><!-- hibernate的相关属性配置--><property name="hibernateProperties"><value><!-- 设置数据库方言-->hibernate.dialect=org.hibernate.dialect.MySQLDialect<!-- 设置自动创建|更新|验证数据库表结构-->hibernate.hbm2ddl.auto=update<!-- 是否在控制台显示sql -->hibernate.show_sql=true<!-- 是否格式化sql,优化显示-->hibernate.format_sql=true<!-- 是否开启二级缓存-->e_second_level_cache=false<!-- 是否开启查询缓存-->e_query_cache=false<!-- 数据库批量查询最大数-->hibernate.jdbc.fetch_size=50<!-- 数据库批量更新、添加、删除操作最大数-->hibernate.jdbc.batch_size=50<!-- 是否自动提交事务-->hibernate.connection.autocommit=true<!-- 指定hibernate在何时释放JDBC连接-->hibernate.connection.release_mode=auto<!-- 创建session方式hibernate4.x 的方式-->hibernate.current_session_context_class=org.springframework.or m.hibernate4.SpringSessionContext<!-- javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个bean-validation**包所以把它设置为none即可-->javax.persistence.validation.mode=none</value></property><!-- 自动扫描实体对象tdxy.bean的包结构中存放实体类--><property name="packagesToScan"value="tdxy.bean"/> </bean><!-- 定义事务管理--><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager "><property name="sessionFactory"ref="sessionFactory"/> </bean><!-- 定义Autowired 自动注入bean --><bean class="org.springframework.beans.factory.annotation.AutowiredAnnotati onBeanPostProcessor"/><!-- 扫描有注解的文件base-package 包路径--><context:component-scan base-package="tdxy"/><tx:advice id="txAdvice"transaction-manager="transactionManager"> <tx:attributes><!-- 事务执行方式REQUIRED:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务。
SpringMVC框架搭建说明Spring4.1.4 + hibernate4.3.81、web.xml配置程序运行时从web.xml开始,加载顺序为:context-param -> listener -> filter ->structs (如果使用structs的话)-> servlet如下为web.xml的配置说明<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xmlns:web="/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><!—-显示项目名称--><display-name>bmymis2</display-name><!-- 指定配置文件位置,contextConfigLocation是ContextLoaderListener中的一个参数,通过该参数在ContextLoaderListener中加载applicationContext-*.xml,并装配ApplicationContext --> <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value></context-param><!-- 定义SPRING监听器,启动Web容器时,自动装配ApplicationContext的配置信息--><listener><listener-class>org.springframework.web.context.ContextLoaderListener </listener-class></listener><!—-字符编码过滤器,解决中文乱码问题--><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><!—- springmvc配置--><servlet><servlet-name>springServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup> //容器启动时首先初始化该servlet </servlet><servlet-mapping><servlet-name>springServlet</servlet-name><url-pattern>/</url-pattern> //表示所有页面都由springmvc处理</servlet-mapping><!—-浏览器输入到项目名,默认打开如下配置页面--><welcome-file-list><welcome-file>/web/login.jsp</welcome-file></welcome-file-list><!—-错误跳转页面--><error-page><error-code>404</error-code><location>/404.html</location></error-page></web-app>2、applicationContext-common.xml配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:context="/schema/context"xmlns:xsi="/2001/XMLSchema-instance"xmlns:tx="/schema/tx"xmlns:aop="/schema/aop"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.0.xsd/schema/context/schema/context/spring-context-4.0.xsd/schema/aop/schema/aop/spring-aop-4.0.xsd/schema/tx/schema/tx/spring-tx-4.0.xsd"><!-- 加载资源文件其中包含变量信息,必须在Spring配置文件的最前面加载,即第一个加载--><context:property-placeholder location="classpath:application.properties"/><!—-扫描包路径选项,使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入,有了该配置,那么<context:annotation-config/>这个配置就可以省略(以下配置包含了<context:annotation-config/>配置)--><context:component-scan base-package="xxx.xxx.xxx"/><!-- 数据源配置,使用应用内的DBCP数据库连接池 --><bean id="dataSource" class="mons.dbcp.BasicDataSource"destroy-method="close"><!-- 定义数据库连接池数据源bean destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用--><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/></bean><!—Hibernate的注解配置 --><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="hibernateProperties"><props><prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop><prop key="hibernate.dialect">${hibernate.dialect}</prop><prop key="hibernate.show_sql">${hibernate.show_sql}</prop></props></property><property name="packagesToScan" value="xxx.xxx.xxx.model" /></bean><!-- 配置Hibernate事务管理器 --><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/></bean><!-- 配置事务异常封装 --><bean id="persistenceExceptionTranslationPostProcessor"class="org.springframework.dao.annotation.PersistenceExceptionTranslationPost Processor"/><!-- 声明式容器事务管理 ,transaction-manager指定事务管理器为transactionManager --> <tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="add*" propagation="REQUIRED"/><tx:method name="get*" propagation="REQUIRED"/><tx:method name="*" read-only="true"/></tx:attributes></tx:advice><aop:config expose-proxy="true"><!-- 只对业务逻辑层实施事务 --><aop:pointcut id="txPointcut"expression="execution(*xxx.xxx.xxx.service..*.*(..))"/><!-- Advisor定义,切入点和通知分别为txPointcut、txAdvice --><aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/> </aop:config></beans>3、application.properties配置jdbc.driverClassName=org.postgresql.Driverjdbc.url=jdbc:postgresql://ip:5432/数据库名ername=postgresjdbc.password=123hibernate.dialect=org.hibernate.dialect.PostgreSQLDialecthibernate.show_sql=truehibernate.format_sql=false4、spring-mvc.xml配置<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:context="/schema/context"xmlns:mvc="/schema/mvc"xmlns:p="/schema/p"xmlns:xsi="/2001/XMLSchema-instance"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd/schema/mvc/schema/mvc/spring-mvc-3.0.xsd/schema/tx/schema/tx/spring-tx-4.0.xsd"><!-- 启用spring mvc 注解 --><mvc:annotation-driven><!-- 自动扫描且只扫描@Controller --><context:component-scan base-package="xxx.xxx.xxx "use-default-filters="false"></context:component-scan><!-- 定义JSP文件的位置 --><beanclass="org.springframework.web.servlet.view.InternalResourceView Resolver"><property name="prefix"value="/jsp/"/><property name="suffix"value=".jsp"/></bean><!-- 容器默认的DefaultServletHandler处理所有静态内容与无RequestMapping处理的URL--> <mvc:default-servlet-handler/><!-- 定义无需Controller的url<->view直接映射 --><mvc:view-controller path="/"view-name="login"/></beans>。
一:关键类与接口Environment类:系统的环境变量key定义基本和hibernate.properties对应Settings类:存放系统配置信息转换的对象熟悉,比如数据库连接provider等Configuration类:系统配置信息皆在此.SessionFactory接口SessionFactoryImplSession接口SessionImplCurrentSessionContext接口ThreadLocalSessionContextConnectionProvider接口DriverManagerConnectionProvider启动代码样例:第一步:分析代码:构造器如下构造器调用一个有参数的构造器,关键是参数:SettingsFactory 构造器什么没有做,郁闷,为什么,这样?呵呵从SettingsFactory名字可以看出, Configuration是需要将配置信息的设置委托给SettingsFactory, Configuration只做自己应该做的事情就是从properties *.cfg.xml读取系统的参数.注意:这个方法可做了很多事情哦;关键是蓝色选中的地方,我们进去一探究竟;可以看出主要是获得一个properties对象,关键是这个对象的数据那里来啊?这个参数又那里来,go on!不要忘记java有个block static哦!哈哈问题在这里,jvm加载这个类的时候,就读取hibernate.properties文件,将起加载到这样回过头看reset()方法就明白了,这里主要初始化一些东西,关键是初始化hibernate.properties文件的信息.现在cfg 指向的对象的properties参数包含了hibernate.properties信息还有System.getProperties()信息!继续很简单,把这个类对应的hbm.xml文件加载,有的同学问命名参数是类,看看代码就明白了!在一个目录下且名称相同.这句是可以动态修改配置信息,其实很简单记得上面说Configuration类的properties对象吗?明白啦,就是向对象的properties对象设置key value继续方法名称可以看出.系统默认加载/hibernate.cfg.xml配置文件,会覆盖hibernate.properties文件的配置信息当然支持自己传配置文件名称,一般不会这样,没有什么大的意思?何况当使用spring管理hibernate时不需要cfg.xml文件,只需要hibernate.properties有同学问那hibernate的hbm映射文件怎么配置,可以通过spring的FactoryBean来动态加载配置给hibernate,也就是把hbm也bean化!主要是获取SessionFactory实例SessionFactoryImpl对象关键是蓝色部分通过properties信息来源hibernate.properties hibernae.cfg.xml还记得上面的那个settingsFactory对象吗[看下图]?现在用到了,呵呵!开源的代码有时间和我们想的未必一样!这个方法就是把来源hibernate.properties hibernae.cfg.xml这个的properties对象放到Settings settings = new Settings();settings对象实例buildSettings方法的上面这段代码很重要哦,几乎所以的配置信息在此都要设置给Settings 这个类的实例对象.说明session是委托给ConnectionProvider实现类获取数据库连接的的可以从配置文件配置哈!自然可以自己实现了.构造SessionFactory工程实例,获取SessionFactory使用.这个构造器有点复杂,觉得hibernate 的代码在此不爽,不过还是进去看看哦.前途是setting这个对象里面的熟悉都是配置文件转换成的java对象哦,比如ConnectionProvider实例,什么数据库支持,事物等等.Hibernate支持自己实现连接Provider类看看这个代码:呵呵如果的配置: hibernate.hbm2ddl.auto=”create”所以hibernate启动会创建数据库表,那自然需要连接数据库,那怎么获得数据库连接哈??? 不要忘记ConnectionProvider构造器只是做一些熟悉设置,把SchemaExport关系的熟悉赋值其实只是引用而已,从这里可以看书cfg ,settings这2个对象相当于上下文的主线.不过这个地方有个疑问,为什么不把setting设置给cfg?????Hibernate首先寻找private String importFile = "/import.sql";导入这个文件的sql执行生成drop的sql语句.生成建表语句.因为importFileReader是null[项目没有配置import.sql],所以没有执行import.sql接下来的代码就是检查配置文件的hql,sql数目.这个构造器还有一行特殊代码:这个代码是根据配置文件提供的hibernate.current_session_context_class的属性决定怎么处理session可以配置thread,呵呵spring也是这样的哦!我写得代码是执行所以说currentSessionContext对象实例是ThreadLocalSessionContext这个类的实例.所以当我们通过Session session=sessionFactory.getCurrentSession();得到实例session时,调用session的.所以可以看出,就是在ThreadLocalSessionContext类中有个private static final ThreadLocal context = new ThreadLocal();获取session如果当前线程没有就新建加入当前线程,有就返回此session.在得到session时间并没有获取connection[数据库连接],当你操作开始session检查事物,connection等开启当前线程结束关闭.11:16:31,906 DEBUG JDBCTransaction:82 - begin11:16:31,906 DEBUG ConnectionManager:444 - opening JDBC connection 11:16:31,906 TRACE DriverManagerConnectionProvider:133 - totalchecked-out connections: 011:16:31,906 TRACE DriverManagerConnectionProvider:139 - using pooled JDBC connection, pool size: 011:16:31,906 DEBUG JDBCTransaction:87 - current autocommit status: false 11:16:31,906 TRACE JDBCContext:237 - after transaction begin11:16:31,906 TRACE ThreadLocalSessionContext:351 - allowing proxied method [createQuery] to proceed to real session11:16:31,921 TRACE QueryPlanCache:92 - unable to locate HQL query plan in cache; generating (from Student)11:16:31,984 DEBUG QueryTranslatorImpl:269 - parse() - HQL: from com.bobo.Student11:16:32,000 DEBUG AST:289 - --- HQL AST ---\-[QUERY] 'query'\-[SELECT_FROM] 'SELECT_FROM'\-[FROM] 'from'\-[RANGE] 'RANGE'\-[DOT] '.'+-[DOT] '.'| +-[IDENT] 'com'| \-[IDENT] 'bobo'\-[IDENT] 'Student'11:16:32,000 DEBUG ErrorCounter:91 - throwQueryException() : no errors11:16:32,046 DEBUG HqlSqlBaseWalker:111 - select << begin [level=1, statement=select]11:16:32,062 DEBUG FromElement:129 - FromClause{level=1} :com.bobo.Student (no alias) -> student0_11:16:32,062 DEBUG HqlSqlBaseWalker:117 - select : finishing up [level=1, statement=select]11:16:32,062 DEBUG HqlSqlWalker:531 - processQuery() : ( SELECT( FromClause{level=1} AuctionUser student0_ ) )11:16:32,078 DEBUG HqlSqlWalker:738 - Derived SELECT clause created. 11:16:32,078 DEBUG JoinProcessor:171 - Using FROM fragment [AuctionUser student0_]11:16:32,078 DEBUG HqlSqlBaseWalker:123 - select >> end [level=1, statement=select]11:16:32,078 DEBUG AST:255 - --- SQL AST ---\-[SELECT] QueryNode: 'SELECT' querySpaces (AuctionUser)+-[SELECT_CLAUSE] SelectClause: '{derived select clause}'| +-[SELECT_EXPR] SelectExpressionImpl: 'student0_.id as id0_' {FromElement{explicit,not a collection join,not a fetch join,fetchnon-lazyproperties,classAlias=null,role=null,tableName=AuctionUser,tableAlias=student0_,origin=null,colums={,className=com.bobo.Student}}}| \-[SQL_TOKEN] SqlFragment: 'student0_.no as no0_'\-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[],fromElementByTableAlias=[student0_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}\-[FROM_FRAGMENT] FromElement: 'AuctionUser student0_' FromElement{explicit,not a collection join,not a fetch join,fetchnon-lazyproperties,classAlias=null,role=null,tableName=AuctionUser,tableAlias=student0_,origin=null,colums={,className=com.bobo.Student}}11:16:32,078 DEBUG ErrorCounter:91 - throwQueryException() : no errors 11:16:32,093 DEBUG QueryTranslatorImpl:239 - HQL: from com.bobo.Student 11:16:32,093 DEBUG QueryTranslatorImpl:240 - SQL: select student0_.id as id0_, student0_.no as no0_ from AuctionUser student0_11:16:32,093 DEBUG ErrorCounter:91 - throwQueryException() : no errors 11:16:32,109 TRACE HQLQueryPlan:293 - HQL param location recognition took 16 mills (from Student)11:16:32,109 TRACE ThreadLocalSessionContext:351 - allowing proxied method [getTransaction] to proceed to real session11:16:32,109 DEBUG JDBCTransaction:134 - commit11:16:32,109 TRACE SessionImpl:365 - automatically flushing session 11:16:32,109 TRACE JDBCContext:228 - before transaction completion11:16:32,109 TRACE SessionImpl:421 - before transaction completion 11:16:32,109 DEBUG JDBCTransaction:147 - committed JDBC Connection 11:16:32,109 TRACE JDBCContext:242 - after transaction completion11:16:32,109 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection11:16:32,109 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]11:16:32,109 TRACE DriverManagerConnectionProvider:178 - returning connection to pool, pool size: 111:16:32,109 TRACE SessionImpl:450 - after transaction completion11:16:32,109 TRACE SessionImpl:381 - automatically closing session 11:16:32,109 TRACE SessionImpl:301 - closing session11:16:32,109 TRACE ConnectionManager:398 - connection already null in cleanup : no action简单总节:Hibernate启动读取hibernate.properties hiernate.cfg.xml文件初始化(properties对象放在Configuration实例对象中同时实例化Settings对象存放,Envriment类似环境的key集合)通过这个觉得做什么操作,包括配置文件加载,是不是执行建表语句.Session获取是通过CurrentSessionContext接口的实例得到具体那个实例根据配置文件.。
hibernate框架的工作原理Hibernate框架的工作原理Hibernate是一个开源的ORM(Object-Relational Mapping)框架,它将Java对象映射到关系型数据库中。
它提供了一种简单的方式来处理数据持久化,同时也提供了一些高级特性来优化性能和可维护性。
1. Hibernate框架的基本概念在开始讲解Hibernate框架的工作原理之前,需要先了解一些基本概念:Session:Session是Hibernate与数据库交互的核心接口,它代表了一个会话,可以用来执行各种数据库操作。
SessionFactory:SessionFactory是一个线程安全的对象,它用于创建Session对象。
通常情况下,应用程序只需要创建一个SessionFactory对象。
Transaction:Transaction是对数据库操作进行事务管理的接口。
在Hibernate中,所有对数据库的操作都应该在事务中进行。
Mapping文件:Mapping文件用于描述Java类与数据库表之间的映射关系。
它定义了Java类属性与数据库表字段之间的对应关系。
2. Hibernate框架的工作流程Hibernate框架主要分为两个部分:持久化层和业务逻辑层。
其中,持久化层负责将Java对象映射到数据库中,并提供数据访问接口;业务逻辑层则负责处理业务逻辑,并调用持久化层进行数据访问。
Hibernate框架的工作流程如下:2.1 创建SessionFactory对象在应用程序启动时,需要创建一个SessionFactory对象。
SessionFactory是一个线程安全的对象,通常情况下只需要创建一个即可。
2.2 创建Session对象在业务逻辑层需要进行数据访问时,需要先创建一个Session对象。
Session是Hibernate与数据库交互的核心接口,它代表了一个会话,可以用来执行各种数据库操作。
2.3 执行数据库操作在获取了Session对象之后,就可以执行各种数据库操作了。
项目中一个需求就是所有的功能都是插件的形式装入系统,这就需要利用Spring去动态加载某一位置下的配置文件,就总结了下Spring中加载xml配置文件的方式, xml是最常见的spring 应用系统配置源。
Spring中的几种容器都支持使用xml装配bean,包括:XmlBeanFactory,ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicationContext,.....一: XmlBeanFactory 引用资源1.Resource cr = new ClassPathResource("applicationContext.xml");BeanFactory bf=new XmlBeanFactory(cr);UserDao userDao = (UserDao)bf.getBean("userDao");二: ClassPathXmlApplicationContext 编译路径使用ClassPathXmlApplicationContext对象获取,必须把applicationContext.xml放置到类的加载路径中,也就是Src下面1.ApplicationContext factory=new ClassPathXmlApplicationContext("classpath:appcontext.xml");// src目录下的2.ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao)context.getBean("userDao");3.ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext-oracle.xml","applicationContext.xml"});UserDao userDao = (UserDao)context.getBean("userDao");// src/conf 目录下的4.ApplicationContext factory=new ClassPathXmlApplicationContext("conf/appcontext.xml");5.ApplicationContext factory=new ClassPathXmlApplicationContext("file:G:/Test/src/appcontext.xml");三: FileSystemXmlApplicationContext用文件系统的路径必须把applicationContext.xml放置到工程目录下面,也就是项目路径的下面1.ApplicationContext factory=newFileSystemXmlApplicationContext("src/appcontext.xml");//使用了classpath: 前缀,作为标志, 这样,FileSystemXmlApplicationContext 也能够读入classpath下的相对路径没有classpath的话就是从当前的工作目录2.ApplicationContext factory=newFileSystemXmlApplicationContext("classpath:appcontext.xml");3.ApplicationContext factory=newFileSystemXmlApplicationContext("file:G:/Test/src/appcontext.xml");4.ApplicationContext factory=newFileSystemXmlApplicationContext("G:/Test/src/appcontext.xml");四: XmlWebApplicationContext是专为Web工程定制的。
第一章【思考题】1、请简述Spring框架的优点。
2、请简述什么是Spring的IoC和DI。
【答案】1、Spring框架的优点如下:(1)非侵入式设计:Spring是一种非侵入式(non-invasive)框架,它可以使应用程序代码对框架的依赖最小化。
(2)方便解耦、简化开发:Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大的降低了组件之间的耦合性。
(3)支持AOP:Spring提供了对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
(4)支持声明式事务处理:只需要通过配置就可以完成对事务的管理,而无需手动编程。
(5)方便程序的测试:Spring提供了对Junit4的支持,可以通过注解方便的测试Spring 程序。
(6)方便集成各种优秀框架:Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持。
(7)降低了Java EE API的使用难度:Spring对Java EE开发中非常难用的一些API (如:JDBC、JavaMail等),都提供了封装,使这些API应用难度大大降低。
2、IoC的全称是Inversion of Control,中文名称为控制反转。
控制反转就是指在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring 容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。
这样,控制权由应用代码转移到了Spring容器,控制权发生了反转。
DI的全称是Dependency Injection,中文称之为依赖注入。
它与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。
从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。
Spring动态加载Hibernate映射文件
在学习编程的过程中,我觉得不止要获得课本的知
识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请登陆疯狂java培训官网。
近来还在整通用的业务系统框架,采用插件的方式加载需要的配置,之前已实现了spring和struts2配置的动态加载,现在剩下Hibernate的映射文件动态加载还没实现,于是搜资料查源码终于实现之。
1、重写SessionFactory类
建一个类,继承org.springframework.orm.hibernate3.LocalSessionFactoryBean, 重写newSessionFactory(Configuration config),
在该方法中调用config.addFile()方法增加需要动态加载的hbm文件,主要代码:
[java]
public class ShineSessionFactoryBean extends LocalSessionFactoryBean{
@Override
protected SessionFactory newSessionFactory(Configuration config)throws HibernateException {
config.addFile("xx1.hbm.xml");//这里将要增加的hbm配置文件都加载到config中
config.addFile("xx2.hbm.xml");
return super.newSessionFactory(config);
}
}
2、修改Spring配置文件
将原来的org.springframework.orm.hibernate3.LocalSessionFactoryBean改成重写后的类,将之前在这里配置的hbm路径去掉,或者保留但不要和插件注入的hbm文件重复,其他属性还是一样。
[html]
<bean id="sessionFactory" class="com.shine.spring.ShineSessionFactoryBean"> <property name="dataSource" ref="dataSource" />
<!-- hbm文件已改成通过插件加载
<property name="mappingLocations">
<list>
<value>classpath*:com/shine/**/entity/hbm/*.hbm.xml</value>
</list>
</property>
-->
</bean>
然后重启后生效,整合在系统中时得注意几个问题:
1、如果newSessionFactory中是从系统的全局变量中取需加载的hbm文件的话,得在spring容器初始化前就给该全局变量设置好值。
2、动态加载的hbm.xml文件时确保文件路径是存在的,如果要加载的配置
文件在jar包中或者不在本机的得针对该配置文件的读取再做封装。
3、如果系统中需有多个SessionFactory时,得让不同的SessionFactory加载不同的hbm配置文件(我通过为SessionFactory增加ID属性来控制)。
疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。
技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。
让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!。