Spring Data 事物的开启不了

来源:互联网 发布:mac上看电视的软件 编辑:程序博客网 时间:2024/05/29 14:16

在进行Spring+SpringMVC+SpringData整合的时候,遇到一个问题。

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">      <!--持久模块名称  -->    <persistence-unit name="dbconfig" transaction-type="RESOURCE_LOCAL">      <!--标记持久层的具体实现  -->    <provider>org.hibernate.ejb.HibernatePersistence</provider>      <!--数据库连接属性信息  -->          <properties>              <!--配置数据库驱动 -->            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />               <!--配置数据库url -->              <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/sss_sys?characterEncoding=UTF-8" />              <!--配置数据库用户名 -->              <property name="hibernate.connection.username" value="lx" />              <!--配置数据库密码 -->              <property name="hibernate.connection.password" value="lx" />              <!--配置Hibernate方言 -->             <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57Dialect" />              <!--设置外连接抓取树的最大深度 -->              <property name="hibernate.max_fetch_depth" value="10" />              <!--自动输出schema创建DDL语句 -->              <property name="hibernate.hbm2ddl.auto" value="update" />            <!-- 显示SQL -->            <property name="hibernate.show_sql" value="true" />              <!--格式化SQL语句  -->            <property name="hibernate.format_sql" value="true" />              <!--验证  -->            <property name="javax.persistence.validation.mode" value="none"/>          </properties>      </persistence-unit>  </persistence>

明明配置的是org.hibernate.dialect.MySQL57Dialect方言,可是加载的时候,却总是说org.hibernate.dialect.MySQL5Dialect方言,导致建表的数据库引擎为MyISAM(该引擎不支持事物)。结果就是Spring的事物总是加不上。
原因:

    <!--跟之前的sessionFactory,JPA操作数据库  -->     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">          <!--持久模块名称  -->        <property name="persistenceUnitName" value="dbconfig"></property>          <!--数据库连接信息的配置文件  -->        <property name="persistenceXmlLocation" value="classpath:persistence.xml"></property>          <!-- <property name="dataSource"></property> -->        <!--jpa适配器  -->        <property name="jpaVendorAdapter">          <!--基于hibernate的 -->            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">                 <!--这里巨坑  -->                <property name="database" value="MYSQL"></property>             </bean>          </property>      </bean>  

就是这个database属性搞的鬼:
看源码:

@Override    public Map<String, Object> getJpaPropertyMap() {        Map<String, Object> jpaProperties = new HashMap<String, Object>();        if (getDatabasePlatform() != null) {            jpaProperties.put(Environment.DIALECT, getDatabasePlatform());        }        //注意这里        else if (getDatabase() != null) {            Class<?> databaseDialectClass = determineDatabaseDialectClass(getDatabase());            if (databaseDialectClass != null) {                jpaProperties.put(Environment.DIALECT, databaseDialectClass.getName());            }        }        /**     * Determine the Hibernate database dialect class for the given target database.     * @param database the target database     * @return the Hibernate database dialect class, or {@code null} if none found     */    @SuppressWarnings("deprecation")    protected Class<?> determineDatabaseDialectClass(Database database) {        switch (database) {            case DB2: return DB2Dialect.class;            case DERBY: return DerbyDialect.class;  // DerbyDialect deprecated in 4.x            case H2: return H2Dialect.class;            case HSQL: return HSQLDialect.class;            case INFORMIX: return InformixDialect.class;            case MYSQL: return MySQL5Dialect.class;            case ORACLE: return Oracle9iDialect.class;            case POSTGRESQL: return PostgreSQLDialect.class;  // PostgreSQLDialect deprecated in 4.x            case SQL_SERVER: return SQLServer2008Dialect.class;            case SYBASE: return org.hibernate.dialect.SybaseDialect.class;  // SybaseDialect deprecated in 3.6 but not 4.x            default: return null;        }    }

因为设置database的值为MYSQL,导致最后加载的时候覆盖了原来的57方言,而使用MySQL5Dialect.class这个方言对MySQL数据库而言就是使用MYSQL,可是该引擎不支持事物。
解决方案:

    <!--跟之前的sessionFactory,JPA操作数据库  -->     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">          <!--持久模块名称  -->        <property name="persistenceUnitName" value="dbconfig"></property>          <!--数据库连接信息的配置文件  -->        <property name="persistenceXmlLocation" value="classpath:persistence.xml"></property>          <!-- <property name="dataSource"></property> -->        <!--jpa适配器  -->        <property name="jpaVendorAdapter">          <!--基于hibernate的 -->            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">             </bean>          </property>      </bean>  

这样就可以了,表的引擎为InnoDB,该引擎支持事物。

原创粉丝点击