getHibernateTemplate.load()一直无法找到数据库中存在的数据

本文探讨了在使用getHibernateTemplate时load与get方法的区别。load方法利用缓存机制导致查询结果为null,而get方法能获取最新数据。通过更改方法解决了问题。

今天在程序里执行getHibernateTemplate.load(),查找数据的时候一直返回一个null,但是通过PL/SQL却可以查找的数据,非常疑惑。

 

最后发现原来是由于getHibernate的缓存机制造成的。

 

getHibernateTemplate的load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。另外如果中途别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据。

 

后来把load改成get之后就取到数据了。

HibernateTemplate.update方法不更新数据库的原因和解决办法如下: ### 原因 - **字段非空约束问题**:当使用hibernateTemplate模板的update或saveOrUpdate方法时,如果数据库表的某些字段设置了not null约束,而在更新对象时这些字段为空,就会抛出空异常,导致更新失败 [^2]。 - **未正确配置事务自动提交**:如果没有正确配置事务自动提交,可能会出现数据无法写入数据库的情况 [^3]。 ### 解决办法 - **处理字段非空约束**:确保更新对象时,所有设置了not null约束的字段都有值。 - **正确配置事务自动提交**:可以在配置文件中设置`hibernate.connection.autocommit`为`true`,示例配置如下: ```xml <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.connection.autocommit">true</prop> </props> </property> <property name="configLocation" value="/WEB-INF/hibernate.cfg.xml"></property> </bean> ``` - **手动管理事务**:可以手动开启、提交或回滚事务。示例代码如下: ```java Session session = getHibernateTemplate().getSessionFactory().openSession(); org.hibernate.Transaction ts = session.beginTransaction(); try { session.flush(); ts.begin(); session.saveOrUpdate(product); ts.commit(); } catch (Exception e) { ts.rollback(); } finally { session.close(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值