Hibernate对数据库的查询

Gon*_*alo 5 mysql database spring hibernate

我遇到了hibernate对数据库进行查询的问题.在进行简单的选择时,这是我的查询日志(使用Mysql 5.1)到数据库:

111125  7:18:30
27 Query    SET autocommit=0
27 Query    SELECT @@session.tx_isolation
27 Query    select this_.id as id34_0_, this_.media_id as media3_34_0_, this_.message as message34_0_, this_.user_id as user4_34_0_ from notifications this_
27 Query    rollback
27 Query    SET autocommit=1
Run Code Online (Sandbox Code Playgroud)

我已经阅读了很多关于将自动提交设置为0然后再设置为1.我知道连接的默认值是1,并且无法更改此行为.您可以运行SET autocommit = 0但结果是相同的.

反正有没有避免任何这些疑问?我不知道为什么SELECT @@ session.tx_isolation正在发生和回滚.当我使用事务时,我得到一个提交然后回滚.不确定为什么回滚始终是有线的.

非常感谢!

我的conf:Spring 2.5.6,Hibernate 3.6.0,Mysql 5.1

datasoure.xml:

<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />

    <property name="initialSize" value="3" />
    <property name="maxActive" value="20" />
    <property name="minIdle" value="3" />
    <property name="poolPreparedStatements" value="false" />
    <property name="defaultAutoCommit" value="false" />
    <property name="defaultTransactionIsolation" value="4" />
</bean>
Run Code Online (Sandbox Code Playgroud)

事务管理器定义:

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)

更新:管理通过设置新属性来取消回滚

<property name="defaultReadOnly" value="true" />
Run Code Online (Sandbox Code Playgroud)

但现在的问题是你不能修改(无论我是否设置事务注释readOnly = false)给db给出一个SQLException.此属性将readonly连接设置为true.我猜测HibernateTemplate无法做到这一点.

我使用aspectj事务进行内码编织.

<aop:aspectj-autoproxy proxy-target-class="true" />
Run Code Online (Sandbox Code Playgroud)

use*_*274 1

您需要为您的应用程序配置事务。请参阅有关事务管理的 Spring 2.5.x 文档

编辑 12/3/11:即使对于只执行选择的方法,您仍然必须创建一个只读事务,以便删除您在帖子中提到的额外查询。只需写 @Transactional(readOnly=true) 就可以了。

2011 年 12 月 20 日编辑:您还需要确保交易配置正确。看起来您发布的配置可能缺少 < tx:annotation-driven /> 注释。请参阅Spring 文档的第 10.5.1 节