Java Hibernate mysql innodb

Java Hibernate mysql innodb,java,mysql,hibernate,orm,dialect,Java,Mysql,Hibernate,Orm,Dialect,我想强制hibernate使用innodb 因此,为了拥有innodb,我更改了hibernate.dial,但是我可以连接到mysql,但是当我执行一些事务时,我出现以下错误: org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常为javax.persistence.RollbackException:标记为rol的事务 lbackOnly 位于org.springframework.orm.jpa.

我想强制hibernate使用innodb

因此,为了拥有innodb,我更改了hibernate.dial,但是我可以连接到mysql,但是当我执行一些事务时,我出现以下错误:

org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常为javax.persistence.RollbackException:标记为rol的事务 lbackOnly 位于org.springframework.orm.jpa.JpaTransactionManager.doCommitJpaTransactionManager.java:465 位于org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommitAbstractPlatformTransactionManager.java:709 位于org.springframework.transaction.support.AbstractPlatformTransactionManager.commitAbstractPlatformTransactionManager.java:678 位于org.springframework.transaction.interceptor.TransactionSpectSupport.commitTransactionAfterReturningTransactionAspectSupport.java:321 位于org.springframework.transaction.interceptor.TransactionInterceptor.invokeTransactionInterceptor.java:116 位于org.springframework.aop.framework.ReflectiveMethodInvocation.proceedReflectiveMethodInvocation.java:171 位于org.springframework.aop.framework.JdkDynamicAopProxy.invokejdkddynamicaopproxy.java:204 在$Proxy46.0处,已知来源

这是我的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>

你知道吗?

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

这种差异不会给您提供跟踪——当您在MyISAM表上使用事务时,所发生的一切就是您没有得到任何事务。一切都成功了,但没有隔离和回滚


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

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

这种差异不会给您提供跟踪——当您在MyISAM表上使用事务时,所发生的一切就是您没有得到任何事务。一切都成功了,但没有隔离和回滚


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

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

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

错误“标记为仅回滚的事务”通常意味着存在潜在的有效hibernate或sql错误。你能试着在日志中找到根本原因吗?真的!我发现了一个潜在的hibernate sql错误!!这不是方言问题。很抱歉,这与最初的问题无关!错误“标记为仅回滚的事务”通常意味着存在潜在的有效hibernate或sql错误。你能试着在日志中找到根本原因吗?真的!我发现了一个潜在的hibernate sql错误!!这不是方言问题。很抱歉,这与最初的问题无关!事实上,这正是我想要的,在默认情况下使用ENGINE=InnoDB创建表。对于以前在MyISAM中创建的表,我执行了一个存储过程,将表MyISAM迁移到InnoDB中。但是,当我使用mysql5innodbdialent而不是mysqldialent时,我遇到了一个问题。事实上,这正是我想要的,在默认情况下使用ENGINE=InnoDB创建表。对于以前在MyISAM中创建的表,我执行了一个存储过程,将表MyISAM迁移到InnoDB中。但是,当我使用mysql5innodbdialent而不是mysqldialent时,我遇到了一个问题,因为我的所有表现在都在InnoDB中。手动更新,当我使用方言mysqldialent而不是mysql5innodbdialent时,一切都很好。但默认情况下不会在InnoDB中创建新表。奇怪,因为我所有的表现在都在InnoDB中。手动更新,当我使用方言mysqldialent而不是mysql5innodbdialent时,一切都很好。但默认情况下,不会在InnoDB中创建新表。