使用OpenSessionInViewFilter 的影响

测试的控制器方法:

 @ResponseBody
    @RequestMapping(value = "/testFlush/json", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
    public String json2(Model model, HttpServletRequest request, HttpServletResponse response
            , int id) {
//        Session session=this.houseEvaluateDao.getSessionFactory().getCurrentSession();
//        session.setFlushMode(FlushMode.MANUAL);
        HouseEvaluate houseEvaluate =  this.houseEvaluateDao.getVariable(id);
//        session.setReadOnly(houseEvaluate,true);
        Double score = new Random().nextDouble();
        System.out.println("score :" + score);
        houseEvaluate.setScore(score);
        HouseEvaluate houseEvaluate22 = this.houseEvaluateDao.getVariable(id - 1);

        houseEvaluate22.setScore(new Random().nextDouble());

        this.houseEvaluateDao.update(houseEvaluate22);
        return BaseResponseDto.jsonValue(houseEvaluate);
    }

没有使用

OpenSessionInViewFilter

时,访问的sql:

Hibernate: 
    select
        houseevalu0_.id as id1_32_0_,
        houseevalu0_.createTime as createTi2_32_0_,
        houseevalu0_.evaluateText as evaluate3_32_0_,
        houseevalu0_.evaluateType as evaluate4_32_0_,
        houseevalu0_.houseInfo_id as houseInf8_32_0_,
        houseevalu0_.orderNo as orderNo5_32_0_,
        houseevalu0_.score as score6_32_0_,
        houseevalu0_.updateTime as updateTi7_32_0_,
        houseevalu0_.userId as userId9_32_0_ 
    from
        t_houseEvaluate houseevalu0_ 
    where
        houseevalu0_.id=?
03 三月 2018 12:12:17,460 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [1] as [INTEGER] - [22]

Hibernate: 
    select
        houseevalu0_.id as id1_32_0_,
        houseevalu0_.createTime as createTi2_32_0_,
        houseevalu0_.evaluateText as evaluate3_32_0_,
        houseevalu0_.evaluateType as evaluate4_32_0_,
        houseevalu0_.houseInfo_id as houseInf8_32_0_,
        houseevalu0_.orderNo as orderNo5_32_0_,
        houseevalu0_.score as score6_32_0_,
        houseevalu0_.updateTime as updateTi7_32_0_,
        houseevalu0_.userId as userId9_32_0_ 
    from
        t_houseEvaluate houseevalu0_ 
    where
        houseevalu0_.id=?
03 三月 2018 12:12:18,007 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [1] as [INTEGER] - [21]

Hibernate: 
    /* update
        oa.entity.HouseEvaluate */ update
            t_houseEvaluate 
        set
            createTime=?,
            evaluateText=?,
            evaluateType=?,
            houseInfo_id=?,
            orderNo=?,
            score=?,
            updateTime=?,
            userId=? 
        where
            id=?
03 三月 2018 12:12:18,615 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [1] as [VARCHAR] - [2017-10-15 12:03:20]
03 三月 2018 12:12:18,623 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [2] as [VARCHAR] - [发布房源]
03 三月 2018 12:12:18,624 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [3] as [INTEGER] - [1]
03 三月 2018 12:12:18,633 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [4] as [INTEGER] - [144]
03 三月 2018 12:12:18,634 TRACE org.hibernate.type.descriptor.sql.BasicBinder:69 - binding parameter [5] as [VARCHAR] - [null]
03 三月 2018 12:12:18,641 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [6] as [DOUBLE] - [0.7026864201132653]
03 三月 2018 12:12:18,645 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [7] as [VARCHAR] - [2017-10-15 12:03:20]
03 三月 2018 12:12:18,649 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [8] as [INTEGER] - [92]
03 三月 2018 12:12:18,654 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [9] as [INTEGER] - [21]

即查询两次,更新一次,这非常好理解,因为我只调用了一次update

 

使用OpenSessionInViewFilter 之后

并且设置

session.setFlushMode(FlushMode.MANUAL);

再次访问,会执行两次update,即也更新了houseEvaluate ,虽然没有显式地调用update

但是我的本意不想更新houseEvaluate,因为我没有手动调用update

怎么办呢?

解决方法:

1,查询对象时,默认采用只读方式

session.setDefaultReadOnly(true);

或者:

session.setReadOnly(entityObj, sessionParam.isReadonly());

2,对于要更新的对象,再修改之前,执行:

this.houseEvaluateDao.setReadOnly(houseEvaluate22,false);

即把persist 对象变为可写.

注意:

(1)过滤器OpenSessionInViewFilter 中依然设置setFlushMode(FlushMode.MANUAL);

(2)必须在对象属性修改之前调用setReadOnly(houseEvaluate22,false),否则无效,不会更新

(3)session的setDefaultReadOnly 值为true

java socket实现的简易的聊天工具demo 见

https://gitee.com/kunlunsoft/inetAdress_socket.git

转载于:https://my.oschina.net/huangweiindex/blog/1628232

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值