在项目中遇到利用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>
分享到:
相关推荐
"hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...
《Hibernate执行持久层访问步骤详解》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式进行数据操作,而无需关注底层的SQL语句。本文将...
这里使用了HQL(Hibernate Query Language)来执行查询。例如,在`getProductsMenuSub`方法中,通过以下HQL语句实现了连表查询: ```java String queryString = "select a.productsName from TopProducts as a, ...
Criteria API提供了一种类型安全的方式,通过构建查询条件来执行数据库查询。例如,你可以通过以下代码获取所有用户: ```java Session session = HibernateUtil.getSessionFactory().openSession(); Criteria ...
// 后执行 tx.commit(); session.close(); } ``` 在 DAO 层,可以使用以下方法来实现批量更新: ```java public void batchInsertCustomers(List<Customer> customerList) { Session session = getSession(); ...
虽然`Criteria API`主要是为了使用Hibernate的ORM功能,但也可以通过`Projections.sqlProjection()`执行原生SQL投影,从而创建自定义的查询。 ```java Criteria criteria = session.createCriteria(User.class); ...
- 实现该接口,使用Hibernate执行具体的查询操作。 ```java public class RoleDAOImpl implements RoleDAO { @Override public List<Role> queryAllRoles() { Configuration cfg = new Configuration(); cfg...
Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...
这个方法会使用Hibernate的`Session`对象的`get`方法来执行查询。 2. **条件查询**:通过传入HQL(Hibernate Query Language)或者Criteria API来实现动态查询。例如`public List<T> findByExample(T exampleEntity...
有时候,我们可能需要执行一些更复杂的SQL查询,这时可以使用Hibernate的Native SQL查询功能。示例如下: ```java String sql = "SELECT b.name, COUNT(a.fee), MIN(a.chargeBeginTime), MAX(a.chargeEndTime) " + ...
// 使用Hibernate执行SQL Session session = sessionFactory.openSession(); SQLQuery query = session.createSQLQuery(sql); // 设置参数绑定 query.setParameter("param1", value1); query.setParameter("param2",...
### Hibernate的查询方式详解 #### 引言 Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,提供了一系列高效、灵活的查询机制,旨在桥接对象模型与关系数据库之间的鸿沟。本文将深入...
4. 使用 Hibernate 条件 API:提供了类型安全的面向对象的方式执行查询。 5. 使用本地 SQL 查询:Hibernate 只关心把 JDBC 结果集映射到持久对象图。 使用 HQL 的优点: * HQL 是一种面向对象的查询语言,易于学习...
本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询DetachedCriteria、例子查询、SQL查询以及命名查询,以满足不同场景下的需求。 1. HQL查询: Hibernate Query Language(HQL)是一种...
它提供了保存、更新、删除对象以及执行查询的能力。当我们想要实现模糊查询时,可以利用`Criteria` API或者`HQL`(Hibernate Query Language)来完成。例如,如果我们要查询一个名为`User`的实体类中所有名字包含...
Criteria API是Hibernate提供的另一种查询方式,它允许开发者通过构建对象化的查询条件来执行数据库查询。下面是如何使用Criteria API查找特定用户的示例: ```java Session session = sessionFactory.openSession...
最后通过`createQuery`方法创建查询对象,并设置参数值,执行查询后返回结果列表。 #### 2. 使用Criteria API 除了HQL之外,Hibernate还提供了Criteria API来进行查询。Criteria API是一种类型安全的API,可以提供...
总结来说,Hibernate的更新操作主要包括配置、创建SessionFactory、打开Session、查询数据、修改对象、调用flush()提交更改,最后关闭Session和SessionFactory。这个过程确保了数据的一致性和事务的管理,是...
在每次更新后调用`session.flush()`强制Hibernate执行当前的数据库操作,然后使用`session.evict(entity)`将实体从缓存中移除。这样做可以确保每个更新操作仅执行一次,并且避免了持久化上下文中的内存浪费。 ```...
这个方法会不断地执行查询,每次获取一层子节点,直到没有新的子节点为止。以下是一个基本的实现思路: ```java public List<Node> fetchAllNodes(Session session, Long rootId) { List<Node> nodes = new ...