Spring + Hibernate 项目中,查询POJO的时候调用 set方法 会将对应字段修改到数据库里面

下面是配置,求解答


public Student querySutdent(id){
Student stu = XXDao.getStudent(id);
stu.setSex("男");
return stu;
}

会将 stu的 sex 更新数据库里面

[code="java"]
<!-- Enable @Transactional support -->
tx:annotation-driven/

<!-- Enable @AspectJ support -->
<aop:aspectj-autoproxy/>

<!-- Activates scanning of @Autowired -->
<context:annotation-config/>

<!-- Activates scanning of @service -->
<context:component-scan base-package="com.chinadrtv.erp.tc;com.chinadrtv.erp.shipment;com.chinadrtv.erp.ic"/>

<tx:advice id="txAdvice">
    <tx:attributes>
        <!-- Read-only commented out to make things easier for end-users -->
        <tx:method name="build*" read-only="true" propagation="REQUIRED" rollback-for="Throwable"/>
        <tx:method name="get*" read-only="true" propagation="REQUIRED" rollback-for="Throwable"/>
        <tx:method name="calculate*" read-only="true" propagation="REQUIRED" rollback-for="Throwable"/>
        <tx:method name="*" propagation="REQUIRED" rollback-for="Throwable"/>
    </tx:attributes>
</tx:advice>

<!-- =================================================================== -->
<!-- AOP: Configuration and Aspects                                      -->
<!-- =================================================================== -->
<aop:config>
    <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Service.*(..))" order="0"/>
    <aop:advisor id="auditLogTx" advice-ref="txAdvice" pointcut="execution(* *..aop.*Service.*(..))" order="1"/>
</aop:config>

[/code]

4个回答

把查询方法设置为只读 即可

weixin_42349387
weixin_42349387 好的,谢谢
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 把查询相关方法 传播行为设置为 NOT_SUPPORT
7 年多之前 回复
weixin_42349387
weixin_42349387 我想要得到的答案是如何配置才能不启用这种特性?
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 楼上已经说了 hibernate是对对象状态管理 你get回来的对象是持久化对象 因此在会话范围内 对它的任意修改 hibernate都能检测到 会自动更新 无需update 因此比如spring data jpa 根本就没有update方法
7 年多之前 回复
weixin_42349387
weixin_42349387 readOnly=true 也不能解决,我想问下, Hibernate 是不是不用执行saveOrUpdate 就可以对POJO写入数据库? 我如何能不启用这个功能呢,强制执行saveOrUpdate 才可以 写入数据库
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian readOnly也是有事务的 只是如果用hibernate 会做优化(不flushsession)
7 年多之前 回复
weixin_42349387
weixin_42349387 readOnly 表示的是事务的传播特性,表示当前事务只能读,并不能起到取消事务的作用
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 在那个查询方法上加 @Transactional(readOnly = true)
7 年多之前 回复
weixin_42349387
weixin_42349387 怎么配置呢,能不能说的详细一点?
7 年多之前 回复

Hibernate的基础问题。因为你的hibernate的对象有4种状态

你通过hibernate的get拿到的 stu对象。
那么这个stu是被纳入session的管理的,当你修改了其属性以后。
hibernate在commit的时候会自动对比对象的属性是否变化。如果变化了就会update

如果不想纳入session的管理。调用session.evict(object) 将stu逐出session的管理即可

weixin_42349387
weixin_42349387 项目中这种写法比较多, 我在 Action 中有时也会这样操作。如果地方多了,一个一个写太多了。我听别人说好像配置OpenSessionInViewFilter 可以解决这个问题,但不会配置
7 年多之前 回复

read-only="true"

stu.setSex("男"); 】

你删除这段代码不就可以了?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐