Spring+Hibernate 整合

整合思路是,使DAO继承HibernateTemplate这个类
HibernateTemplate这个类提供了setSessionFactory()方法用于注入SessionFactory
通过spring获取DAO的时候,注入SessionFactory.

简单说就是在DAO层中继承HibernateTemplate然后直接使用HibernateTemplate提供的CRUD简单的方法, 然后对HibernateTemplate内部的sessionFactory使用Spring的DI来注入;

配置文件这样:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="c" class="Entity.Category">
        <property name="name" value="Sony" />
    </bean>

    <bean name="cdao" class="Dao.CategoryDAO">
        <property name="sessionFactory" ref="sf" />
        <property name="checkWriteOperations" value="false" />
    </bean>

    <bean name="sf" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="ds" />
        <property name="mappingResources">
            <list>
                <value>Entity/Category.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
                hibernate.show_sql=true
                hibernate.hbm2ddl.auto=update
            </value>
        </property>
    </bean>

    <bean name="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/demo?characterEncoding=UTF-8" />
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean>
</beans>

要注意的几点:
1.在Hibernate5里面要在继承了HibernateTemplate的DAO层里面进行配置

<property name="checkWriteOperations" value="false" />

否则不能直接写入数据
不知道这里有没有更好的解决办法…我在Stack Overflow上只找到这个办法;
似乎使用hibernate3的话不会有这个问题

2.在hibernate5中没有schema_update这个属性了, 直接配置hibernate.hbm2ddl.auto=update即可

调整applicationContext.xml以使得其支持c3p0数据库连接池
主要是修改数据源database

  1. database class
    从 org.springframework.jdbc.datasource.DriverManagerDataSource
    改为 com.mchange.v2.c3p0.ComboPooledDataSource
  2. driverClassName 改为 driverClass
  3. url 改为 jdbcUrl
  4. username 改为 user
  5. 增加c3p0相关配置

数据源配置如下:

    <bean name="ds"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
 
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUrl"
            value="jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=UTF-8" />
        <property name="user" value="root" />
        <property name="password" value="admin" />
         
        <!--连接池中保留的最小连接数。-->
        <property name="minPoolSize" value="10" />
        <!--连接池中保留的最大连接数。Default: 15 --> 
         
        <property name="maxPoolSize" value="100" />
        <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 
         
        <property name="maxIdleTime" value="1800" />
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 
         
        <property name="acquireIncrement" value="3" />
        <!--最大的Statements条数 -->
        <property name="maxStatements" value="1000" />
        <!--初始化10条连接 -->
        <property name="initialPoolSize" value="10" />
        <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 
        <property name="acquireRetryAttempts" value="30" />
         
        <!--每隔60秒发一次心跳信号到数据库,以保持连接的活性 -->
        <property name="idleConnectionTestPeriod" value="60" />
         
    </bean>

猜你喜欢

转载自blog.csdn.net/qq_33982232/article/details/87901575
今日推荐