zoukankan      html  css  js  c++  java
  • javaEE中的hibernate配置笔记

    0 从web.xml出发

    项目中用Spring整合Hibernate,Spring贯穿整个项目,所以先看看Spring在哪一步整合了Hibernate。先看部分web.xml。

    context-param设定参数contextConfigLocation。

    在listener配置基于Web上下文级别的监听器ContextLoaderListener,它会加载contextConfigLocation中的配置文件。

    其中最重要的是spring-hibernate.xml,这里面配置了hibernate。

    <!-- 指定spring相关文件的位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml,classpath:spring-ehcache.xml,classpath:spring-hibernate.xml</param-value>
    </context-param>
    
    <!-- 开启spring功能 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    1 spring-hibernate.xml

    1.1 配置数据源

    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc_url}" />
        <property name="username" value="${jdbc_username}" />
        <property name="password" value="${jdbc_password}" />
    
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="0" />
        <!-- 连接池最大使用连接数量 -->
        <property name="maxActive" value="20" />
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="0" />
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="60000" />
    
        <!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> -->
    
        <property name="validationQuery" value="${validationQuery}" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <property name="testWhileIdle" value="true" />
    
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="25200000" />
    
        <!-- 打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="true" />
        <!-- 1800秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="1800" />
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true" />
    
        <!-- 监控数据库 -->
        <!-- <property name="filters" value="mergeStat" /> -->
        <property name="filters" value="stat" />
    </bean>

    1.2 配置hibernate session工厂

    <!-- 配置hibernate session工厂 -->
    <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>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>
            </props>
        </property>
    
        <!-- 自动扫描注解方式配置的hibernate类文件 -->
        <property name="packagesToScan">
            <list>
                <value>light.mvc.model</value>
            </list>
        </property>
    
    </bean>

    1.3 配置事务管理(AOP)

    <!-- 配置事务管理器 -->
    <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
    <!-- 拦截器方式配置事物 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="append*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />
            <tx:method name="edit*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="init" propagation="REQUIRED" />
            <tx:method name="delAndInit" propagation="REQUIRED" />
    
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="load*" propagation="REQUIRED" read-only="true" />
            <tx:method name="search*" propagation="REQUIRED" read-only="true" />
            <tx:method name="datagrid*" propagation="REQUIRED" read-only="true" />
    
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
        
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* light.mvc.service..*Impl.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
    </aop:config>

    2 spring-hibernate.xml

    spring.xml中加载了一些数据库参数,参数在config.properties文件中进行设置,比如jdbc_url、jdbc_username、jdbc_password这些参数。

    同时扫描service组件和dao组件实现自动注入。

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config.properties</value>
            </list>
        </property>
    </bean>
    <!-- 自动扫描repository和service包(自动注入) -->
    <context:component-scan base-package="light.mvc.dao,light.mvc.service" />

    3 config.properties文件

    hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    driverClassName=com.mysql.jdbc.Driver
    validationQuery=SELECT 1
    jdbc_url=jdbc:mysql://222.222.222.222:3306/xxx?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&&autoReconnect=true
    jdbc_username=xxx
    jdbc_password=xxx
    
    hibernate.hbm2ddl.auto=none
    hibernate.show_sql=false
    hibernate.format_sql=false
    hibernate.use_sql_comments=false

    4 如果想操作两个数据库

    config.properties配置文件中,新增数据库url,username和password

    spring-hibernate.xml中复制一个新的数据源<bean class=”…DataSource”>,复制的数据源需要修改bean的name,以及属性url、username和password的值

    spring-hibernate.xml中复制一个新的session工厂<bean class=”…SessionFactory…”>复制的session工厂需要修改bean的id,以及属性dataSource和packagesToScan

    spring-hibernate.xml中复制一个新的事务管理器,修改bean的name和sessionFactory属性

    结合本项目框架,在spring-hibernate中还需配置新的tx:advice和aop:config标签

    在Dao操作中使用新配置的sessionFactory进行操作,即可对新数据库进行操作

  • 相关阅读:
    C#多线程下更新UI的几种方法
    .net WebApi使用swagger 美化接口文档
    C#内存管理
    LINQ 推迟查询的执行
    C#多播委托详解
    泛型委托
    使用 ref 和 out 传递数组注意事项
    何时使用委托而不使用接口
    委托中的协变和逆变
    细说SQL Server数据类型
  • 原文地址:https://www.cnblogs.com/liaohuiqiang/p/7440516.html
Copyright © 2011-2022 走看看