1

我想强制休眠使用innodb。

所以,我更改了“hibernate.dialect”以便拥有innodb,但我可以连接到mysql,但是当我做一些交易时,我有以下错误:

org.springframework.transaction.TransactionSystemException:无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException:在 org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java: 709)在 org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)在 org.springframework.transaction.interceptor.TransactionInterceptor .invoke(TransactionInterceptor.java:

这是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd" version="1.0">
    <persistence-unit name="name" transaction-type="RESOURCE_LOCAL">         
        <provider>org.hibernate.ejb.HibernatePersistence</provider>      
        <properties>
            <property name="hibernate.archive.autodetection" value="class, hbm"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>                      
            <property name="hibernate.hbm2ddl.auto" value="update"/>    
            <!--        
            <property name="hibernate.c3p0.min_size" value="5"/>
            <property name="hibernate.c3p0.max_size" value="20"/>
            <property name="hibernate.c3p0.timeout" value="300"/>
            <property name="hibernate.c3p0.max_statements" value="50"/>
            <property name="hibernate.c3p0.idle_test_period" value="3000"/>     
            --> 
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://xxxxxx"/>
            <property name="hibernate.connection.username" value="xxxxx"/>
            <property name="hibernate.connection.password" value="xxxxxx"/>

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

            <!-- Connection auto reconnect after long inactivity -->
            <property name="connection.autoReconnect" value="true"/>
            <property name="connection.autoReconnectForPools" value="true"/>
            <property name="connection.is-connection-validation-required" value="true"/>
        </properties>
    </persistence-unit>         
</persistence>

你有什么主意吗 ?

4

2 回答 2

4

使用MySQL5InnoDBDialect只是告诉 Hibernate"ENGINE=InnoDB"在模式导出期间生成 DDL 时添加,仅此而已。我不确定现有的表格是否会被更改。因此,如果您有使用 MyISAM 的现有表,则可能必须手动更改它们。

于 2010-06-23T17:15:24.207 回答
2

Hibernate 对表是 Inno、MyISAM 还是其他存储引擎没有发言权——这是在 MySQL 方面决定的。服务器配置中有默认值,您可以在创建表时覆盖它们。

不同之处不会给您提供跟踪 - 当您在 MyISAM 表上使用事务时发生的所有事情都是您没有得到任何事务。一切都成功了,但没有孤立,也没有回滚。

根据@shipmaster,您的跟踪意味着您有一个潜在的问题,这可能与您的方言选择无关。查看日志,或将 Spring 的源代码附加到项目并跟踪它们。

于 2010-06-23T17:01:15.863 回答