hibernate查询后执行了更新

本文讨论了一个在项目中遇到的难题:使用Hibernate执行查询后,竟然对数据库记录进行了更新,导致错误。通过调整Spring事物配置和实体类属性访问方式,最终找到了并解决了问题。同时,解释了查询结果中包含null值转换为对Hibernate的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中遇到利用hibernate执行查询后居然对数据库记录进行了更新,导致了错误。

 

代码如下:

 

 public List getRetailDCList(CreditOrderScope scope) {
  List rst = rcDao.getRetailDCList(scope);
  for (int n = 0; n < rst.size(); n++) {
   RetailDC fp = (RetailDC) rst.get(n);
      Hibernate.initialize(fp.getRetailDCPackage());
      Hibernate.initialize(fp.getNsClient());
      Hibernate.initialize(fp.getBpBank());
   if (fp.getNsClient() != null) {
    Hibernate.initialize(fp.getNsClient().getPayType());
   }
  }
  return rst;
 }

 

在return  之后调用了spring的jar包,事物拦截器拦截后执行到invock方式时,就对记录进行了update动作。

 

刚开始疑似事物的原因。因此对原来的事物稍作了修改。

 

原来applicationContext.xml中事物:(定义抽象事物,需要事物的类通过继承的方式使用事物)

 

<bean id="baseTxProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
		<property name="transactionManager">
			<ref bean="transactionManager" />
		</property>
		<property name="transactionAttributes">
			<props>
				<prop key="*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>


<bean id="bankInterfaceService" parent="baseTxProxy">
	    		<property name="target">
			<bean class="com.service.impl.BankInterfaceServiceImpl"
				parent="baseService">
			</bean>
		</property>
	</bean>

 

 

 继承事物后是对类中所有的 set  get  save  read 方法都使用了同样的事物,为了单独设置事物的属性,对这些属性进行了继承修改。对get方法事物属性设置了readonly。修改后如下:

<bean id="bankInterfaceService" parent="baseTxProxy">
	    <property name="transactionAttributes">
			<props>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="set*">PROPAGATION_REQUIRED</prop>
				<prop key="process*">PROPAGATION_REQUIRED</prop>
				<prop key="read*">PROPAGATION_REQUIRED</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
			</props>
		</property>
		<property name="target">
			<bean class="com.nstc.dnaf.service.impl.BankInterfaceServiceImpl"
				parent="baseService">
			</bean>
		</property>
	</bean>

 

 

 至此问题解决完毕。后来探究查询后进行了更新的真正原因。是因为在查询的实体类中有如下写法。

 

 

	public String getFeedBack() {
		if(this.feedBack==null){
			this.feedBack="";
		}
		return this.feedBack;
	}

 

因为在数据库中是null,在hibernate查询时会设置成“”。hibernate会任务session中的实体发生了改变,就会执行update。至此原因

 

 在进行脏数据检查时会认为它是脏数据,需要更新

 

 另外一种解决方式:

 

 采用的解决办法是将配置文件增加一个属性access="field" 这样就不会通过get方法比较属性而直接访问属性字段
<property name="feedBack" type="java.lang.String" access="field">
  <column name="feedBack" length="50" />
 </property>

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值