用Hibernate 查询数据库 居然执行了更新操作,奇怪

我用hibernate查询数据库,在service层查询数据库后在service层设置了一下查询出来的pojo的属性,Hibernate居然给我更新到数据中了,代码如下:

DAO代码如下:

public City getCityById(String cityCode) throws DAOException {
try{
return (City)getHibernateTemplate().get(City.class, cityCode);
}catch(DataAccessException e) {
    logger.error(e);
    throw new DAOException("data access exception", e);
}
}
Service代码如下:

public City getCityById(String cityCode) throws ApplicationException {
try {
City city = cityDao.getCityById(cityCode);
city.setCityName("test1");
return city;
} catch (DAOException e) {
throw new ApplicationException("dao error", e);
}
}

执行完上面的service之后,Hibernate居然还执行了一条更新语句
update city set city_name='test1' where city_code='beijing';

问题补充
我发现若是不配置Spring的事务,就没有这个问题
    <property name="transactionAttributes">
      <props>
        <prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
        <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
    </property>

把上面get*那行去掉,就不会自动更新了。
但是这样的话就等于没有事务控制了,也是不行的。
2008年11月22日 10:13

5个答案 按时间排序 按投票排序

0 0

从数据库取对象的时候不要用get()方法
用createQuery()方法

2008年11月25日 13:48
0 0

原因:您对已经持久的引用对象的值进行了修改
解决方案:<prop key="get*">的值设置为PROPAGATION_REQUIRED,readOnly

2008年11月24日 12:09
0 0

get的设置为PROPAGATION_REQUIRED,readOnly的就可以了

2008年11月22日 10:26
0 0

引用
<prop key="get*">PROPAGATION_REQUIRED,-Exception</prop>


实体对象,是不能直接操作的修改的; 要通过其他方式返回; 然后你可以处理然后,返回到服务层.

另外,可以修改下事物属性,看看.  也许get*没必要增加事务控制;

2008年11月22日 10:16
0 0

city.setCityName("test1");

你在这个为持久化的对象赋值了,hibernate会将持久化的对象更新的。如果你将session中的这个对象清除,service执行完,就不会更行了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值