集成Hibernate
公司项目使用阿里巴巴的Druid数据源来支持分布式的事务操作。
引入jar包
druid-1.0.23.jar
hibernate-3.5.5-Final.jar
hibernate-entitymanager.jar
hibernate-jpa-2.0-api-1.0.1.final.jar
hibernate-validator.jar
mysql-connector-java-5.1.38-bin.jar
hibernate属性文件
hibernate.properties
#Hibernate 配置
#hibernate方言 依次为: mysql5,mysqlInnoDB(推荐),SQLServer,HSQL,Oracle9i以上版本
#hibernate.dialect=org.hibernate.dialect.MySQLDialect
#hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.dialect=hibernate.Dialect
#auto = none: 不做任何操作
#create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行。会导致数据库表数据丢失。
#create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
#update:第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
#validate:验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
hibernate.hbm2ddl.auto=none
#关于hibernate.jdbc.fetch_size与hibernate.jdbc.batch_size的设置,可能会将严重影响Hibernate的CRUD性能。
#设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。
#Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。
#MySQL就支持Fetch Size特性
hibernate.jdbc.fetch_size=100
#设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小。
#Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。
hibernate.jdbc.batch_size=50
#显示SQL语句,如果不想让SQL在控制台输出,以下的三项全部设置为false
hibernate.show_sql=true
#格式化SQL语句
hibernate.format_sql=true
#如果设置为true,Hiberante将为SQL产生注释,这样更利于调试。默认值为false。
hibernate.use_sql_comments=false
配置hibernate属性
applicationContext.xml
<!--1. 读取配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
<value>classpath*:hibernate.properties</value>
</list>
</property>
</bean>
<!--配置hibernate属性 -->
<bean name="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>
</props>
</property>
</bean>
<!--2. 配置sessionFactory工厂Bean和事务管理器。见spring集成Atomikos,第二篇 -->
<!--3、配置tx/aop声明式事务, 声明一个切面 -->
<tx:advice id="txWorksysAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception" isolation="DEFAULT" />
<!--
<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception" isolation="DEFAULT" />
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="get*" propagation="REQUIRED" no-rollback-for="Exception" read-only="true"/>
<tx:method name="find*" propagation="REQUIRED" rollback-for="Exception" read-only="true" />
-->
</tx:attributes>
</tx:advice>
<!-- 4、把切面注入到业务中 -->
<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* com.juttec..*.service.*.*(..))" advice-ref="txWorksysAdvice" />
<!-- <aop:advisor advice-ref="txWorksysAdvice" pointcut="execution(* org.snaker.engine.core..*.*(..))"/> -->
</aop:config>
<!-- 针对注解的处理器配置 -->
<context:annotation-config />
<!-- 使用 annotation 自动注册bean,并检查@Controller, @Service, @Repository注解已被注入 -->
<context:component-scan base-package="com.juttec">
</context:component-scan>
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
<tx:annotation-driven proxy-target-class="true"/>
==注意==:本来要配置transaction-manager属性,如:。这里没有配置是因为它的默认值是transactionManager。
配置sessionFactory类
MainDaoSupport.java
package com.juttec.core.dao;
import java.io.Serializable;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class MainDaoSupport<T, PK extends Serializable> extends HibernateDao<T, PK>
{
@Autowired
@Qualifier("mainSessionFactory")
public void setSessionFactory(SessionFactory sessionFactory)
{
super.setSessionFactory(sessionFactory);
}
}
AppDaoSupport
package com.juttec.core.dao;
import java.io.Serializable;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class AppDaoSupport<T, PK extends Serializable> extends HibernateDao<T, PK>
{
@Autowired
@Qualifier("appSessionFactory")
public void setSessionFactory(SessionFactory sessionFactory)
{
super.setSessionFactory(sessionFactory);
}
}
上面的基类HibernateDao.java详见《==继承DaoSupport实现自己的DAO基类==》