mysql:
//localhost/auction"/>
--指定连接数据库的用户名-->
--指定连接数据库的密码-->
--指定连接数据库连接池的最XX接数-->
--指定连接数据库连接池的最小连接数-->
--指定连接数据库连接池的初始化连接数-->
--指定连接数据库连接池的连接的最大空闲时间-->
--配置数据库会话工厂-->
/ouya/User.hbm.xml
org.hibernate.dialect.MySQLDialect
true
true
--配置事务管理器-->
—-配置Spring事务管理器代理-->
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
--Hibernate模板-->
--服务层对象-->
--spring代理用户服务对象-->
--如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常-->
---->
--用户数据访问对象DATAACCESSOBJECT-->
可以看到配置文件的步骤:
1、配置数据源
2、配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件)
3、配置事务管理器(依赖注入上面的会话工厂)
4、Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes)
后面的一些普通的bean配置就不用说了
上面的例子中使用的声明事务管理器是:
TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService(没有实现接口),所以我们为他配置了id为userService的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务
程序中调用:
UserServiceus=(UserService)app.getBean("userService");
注:
userService就是上面配置的代理对象的id,而不是原服务对象的id
但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):
1、增加一个事务拦截器
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
2、定义自动代理事务管理器
--定义BeanNameAutoProxyCreator-->
--如果服务层对象是接口实现类,则需要设置proxyTargetClass属性为true-->
--
--指定对满足哪些beanname的bean自动生成业务代理-->
--下面是所有需要自动创建事务代理的bean-->
us
--此处可增加其他需要自动创建事务代理的bean-->
--下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
--此处可增加其他新的Interceptor-->
transactionInterceptor
然后我们在程序中调用时应如下:
UserServiceus=(UserService)app.getBean("us");
注:
注意与上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是
BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所在
附录:
1、关于hibernate的属性详解:
--以下配置都是使用jdbc.properties属性文件中的配置,而之所以可以这样写,就是因为有属性占位符配置的原因-->
--连接池维持的最小的连接个数-->
--连接池维持的最大的连接个数-->
--最大空闲时间,当某个连接在这个时间内没活动后将从池中移除,前提是池中至少多于最少的连接数:
minPoolSize-->
--为加强准备语句的执行性能,此参数指定被缓存的PreparedStatement的个数-->
Hibernate会话厂SessionFactory
Session就是用于每次与数据库会话的,因此需要:
数据库的配置参数,这些参数就是上面的数据源指定的!
因此我们只需引用即可:
ref="dataSource";
实体映射配置hibernate.cfg.xml配置
结果缓存配置(这里使用的是开源的ehcache)
--HibernateSessionFactory-->
--引用前面定义的数据源-->
--所有实体映射文件列表,所有的hbm.xml文件-->
org/springframework/samples/jpetstore/domain/Account.hbm.xml
org/springframework/samples/jpetstore/domain/Banner.hbm.xml
org/springframework/samples/jpetstore/domain/Category.hbm.xml
org/springframework/samples/jpetstore/domain/Inventory.hbm.xml
org/springframework/samples/jpetstore/domain/Item.hbm.xml
org/springframework/samples/jpetstore/domain/LineItem.hbm.xml
org/springframework/samples/jpetstore/domain/Order.hbm.xml
org/springframework/samples/jpetstore/domain/Product.hbm.xml
org/springframework/samples/jpetstore/domain/Supplier.hbm.xml
--传统上的hibernate.cfg.xml文件的参数放在这里-->
--指定数据库方言-->
${hibernate.dialect}
--是否在日志中输出所有Hibernate与数据库交互的SQL语句-->
true
--是否在日志中输出的SQL语句格式化成易读形式-->
true
--是否显示统计形式,一般在测试阶段使用-->
true
--对于级联查询,一次性获取的级联深度,todo需进一步研究-->
2
--
FetchSize是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30、50、100。
Oracle数据库的JDBC驱动默认的FetchSize=15,设置FetchSize设置为:
30、50,性能会有明显提升,如果继续增大,
超出100,性能提升不明显,反而会消耗内存。
-->
100
--
不必等到累计到50个SQL之后才执行.只要事务mit后,不管缓存中有多少条sql语句都要执行.
hibernate.jdbc.batch_size参数只是设定一次最多可以提交多少sql语句的上限,提高sql语句的执行效率
-->
50
--
(1)create在每次SesstionFactory构建时(一般是应用重启时,或者伴随着应用服务器重启时),先将之前数据库中的所有数据全
部清空,后紧跟着根据所有的hbm.xml映射文件重新创建新的数据库表
(2)create-drop除了create的所有含义之外,在每次应用的退出前,将进行一次数据空清空。
因此这个配置将有两次清空操作,
一次是退出,一次是启动时。
(3)update
如果在开发阶段理发了实体对象的映射文件(hbm.xml)的定义后,此配置将后台的数据库表进行更新(如增加表的列)
(4)validate
用于校验现有的表与现有的配置是否一致。
-->
update
--见下面的解释-->
update
--结果缓存配置:
-将ehcache.xml置于classpath中-如果不设置“查询缓存”,
那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、
Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置
hibernate.cache.use_query_cachetrue才行-在Hbm文件中添加-
如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性-->
true
org.hibernate.cache.EhCacheProvider