`

hibernate查询后执行了更新

 
阅读更多

在项目中遇到利用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>

 


分享到:
评论
2 楼 zqy363766028 2012-11-27  
多谢楼主,还是理解到了,根据我们自己的项目中的逻辑,改成了load方法
1 楼 sdtzyb 2012-03-22  
必须顶起,费死劲了。不知道好使不。

相关推荐

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...

    Hibernate执行持久层访问步骤

    《Hibernate执行持久层访问步骤详解》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式进行数据操作,而无需关注底层的SQL语句。本文将...

    Hibernate连表查询 Hibernate连表查询

    这里使用了HQL(Hibernate Query Language)来执行查询。例如,在`getProductsMenuSub`方法中,通过以下HQL语句实现了连表查询: ```java String queryString = "select a.productsName from TopProducts as a, ...

    通用的hibernate查询

    Criteria API提供了一种类型安全的方式,通过构建查询条件来执行数据库查询。例如,你可以通过以下代码获取所有用户: ```java Session session = HibernateUtil.getSessionFactory().openSession(); Criteria ...

    Hibernate中大量数据的更新

    // 后执行 tx.commit(); session.close(); } ``` 在 DAO 层,可以使用以下方法来实现批量更新: ```java public void batchInsertCustomers(List&lt;Customer&gt; customerList) { Session session = getSession(); ...

    hibernate 执行原生sql的几种方式

    虽然`Criteria API`主要是为了使用Hibernate的ORM功能,但也可以通过`Projections.sqlProjection()`执行原生SQL投影,从而创建自定义的查询。 ```java Criteria criteria = session.createCriteria(User.class); ...

    struts+hibernate查询所有记录

    - 实现该接口,使用Hibernate执行具体的查询操作。 ```java public class RoleDAOImpl implements RoleDAO { @Override public List&lt;Role&gt; queryAllRoles() { Configuration cfg = new Configuration(); cfg...

    Hibernate_query查询数据表中的一个字段.

    Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...

    超好用的hibernate查询工具类

    这个方法会使用Hibernate的`Session`对象的`get`方法来执行查询。 2. **条件查询**:通过传入HQL(Hibernate Query Language)或者Criteria API来实现动态查询。例如`public List&lt;T&gt; findByExample(T exampleEntity...

    hibernate多表联合查询

    有时候,我们可能需要执行一些更复杂的SQL查询,这时可以使用Hibernate的Native SQL查询功能。示例如下: ```java String sql = "SELECT b.name, COUNT(a.fee), MIN(a.chargeBeginTime), MAX(a.chargeEndTime) " + ...

    hibernate实现动态SQL查询

    // 使用Hibernate执行SQL Session session = sessionFactory.openSession(); SQLQuery query = session.createSQLQuery(sql); // 设置参数绑定 query.setParameter("param1", value1); query.setParameter("param2",...

    Hibernate的查询方式

    ### Hibernate的查询方式详解 #### 引言 Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,提供了一系列高效、灵活的查询机制,旨在桥接对象模型与关系数据库之间的鸿沟。本文将深入...

    Hibernate查询语言HQL.PPT

    4. 使用 Hibernate 条件 API:提供了类型安全的面向对象的方式执行查询。 5. 使用本地 SQL 查询:Hibernate 只关心把 JDBC 结果集映射到持久对象图。 使用 HQL 的优点: * HQL 是一种面向对象的查询语言,易于学习...

    hibernate查询详解

    本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询DetachedCriteria、例子查询、SQL查询以及命名查询,以满足不同场景下的需求。 1. HQL查询: Hibernate Query Language(HQL)是一种...

    hibernate 模糊查询 分页

    它提供了保存、更新、删除对象以及执行查询的能力。当我们想要实现模糊查询时,可以利用`Criteria` API或者`HQL`(Hibernate Query Language)来完成。例如,如果我们要查询一个名为`User`的实体类中所有名字包含...

    hibernate查询方法

    Criteria API是Hibernate提供的另一种查询方式,它允许开发者通过构建对象化的查询条件来执行数据库查询。下面是如何使用Criteria API查找特定用户的示例: ```java Session session = sessionFactory.openSession...

    HQL是hibernate自己的一套查询

    最后通过`createQuery`方法创建查询对象,并设置参数值,执行查询后返回结果列表。 #### 2. 使用Criteria API 除了HQL之外,Hibernate还提供了Criteria API来进行查询。Criteria API是一种类型安全的API,可以提供...

    hibernate更新操作

    总结来说,Hibernate的更新操作主要包括配置、创建SessionFactory、打开Session、查询数据、修改对象、调用flush()提交更改,最后关闭Session和SessionFactory。这个过程确保了数据的一致性和事务的管理,是...

    在Hibernate中处理批量更新和批量删除

    在每次更新后调用`session.flush()`强制Hibernate执行当前的数据库操作,然后使用`session.evict(entity)`将实体从缓存中移除。这样做可以确保每个更新操作仅执行一次,并且避免了持久化上下文中的内存浪费。 ```...

    hibernate实现递归查询

    这个方法会不断地执行查询,每次获取一层子节点,直到没有新的子节点为止。以下是一个基本的实现思路: ```java public List&lt;Node&gt; fetchAllNodes(Session session, Long rootId) { List&lt;Node&gt; nodes = new ...

Global site tag (gtag.js) - Google Analytics