spring+hibernate--直接修改数据库,再通过hibernate查询数据不变
这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响。
刚好今天没事,想好好解决一下这个问题。
hibernate主要配置如下:
<property name="hibernate.format_sql">true</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/vipmf?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.autocommit">false</property>
<property name="show_sql">true</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.current_session_context_class">
thread
</property>
<property name="hibernate.cache.use_query_cache">
false
</property>
spring配置:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocations">
<list>
<value>classpath:hibernate.cfg.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 为事务管理器注入sessionFactory" -->
<property name="sessionFactory" ref="sessionFactory" />
</bean> <!-- 配置事务拦截器Bean -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 为事务拦截器bean注入一个事物管理器 -->
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<!-- 定义事务传播属性 -->
<props>
<prop key="*save">PROPAGATION_REQUIRED</prop>
<prop key="*remove">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="autoproxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
先写一个测试类,直接使用hibernate:
public class Test_Hibernate {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session session = factory.getCurrentSession();
Transaction tr = session.beginTransaction();
// add(session);
//// delete(session, 3);
// tr.commit();
// factory.close();
select(session);
tr.commit();
// factory.close();
session = factory.getCurrentSession();
session.beginTransaction();
select(session);
session.getTransaction().commit();
factory.close();
}
static void add(Session session) {
Qsource qsource = new Qsource();
qsource.setUrl("http://www.baidu.com");
session.save(qsource);
}
static void delete(Session session, long id) {
Kind kind = (Kind) session.get(Kind.class, id);
session.delete(kind);
}
static void select(Session session) {
List<Qsource> list = session.createQuery("from Qsource").list();
System.out.println(list.size());
}
}
程序中查询了两次,在第一次和第二次查询之间插入断点,第一次打印结果后,直接往数据库中插入一条记录,再继续执行,发现结果是正常的。
再写一个spring,hibernate的测试类:
public class SpringHibernate_test {
public static void main(String[] args) throws Exception {
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:*-context.xml");
// GrabService ms = (GrabService) ac.getBean("grabService");
// GrabParam p = new GrabParam();
// p.setSingleUrl("http://www.xxsy.net/books/486729/5340636.html");
// ms.findSection(p);
QsourceService qs = (QsourceService) ac.getBean("qsourceService");
// Qsource q = new Qsource();
// q.setUrl("aaaaaaa");
// qs.save(q);
System.out.println(qs.getAll().size());
System.out.println(qs.getAll().size());
}
}
打印第一次结果后,直接往数据库中插入数据,再继续执行程序,第二次打印的结果和第一次相同,这是为什么呢?
先看一下hibernate的配置,
<property name="hibernate.current_session_context_class">
thread
</property>
这个配置是说把session绑定到本地线程,不需要手动关闭,事务提交时自动关闭。
再看spring配置的事务,只有save和remove结尾的程序才使用事务,看来问题就是在这了。事务没有提交,session没有关闭,一级缓存没有清除。
把配置改一下
<!-- 定义事务传播属性 -->
<props>
<prop key="*save">PROPAGATION_REQUIRED</prop>
<prop key="*remove">PROPAGATION_REQUIRED</prop>
<prop key="export">PROPAGATION_REQUIRED</prop>
<prop key="getAll">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED</prop>
<prop key="list*">PROPAGATION_REQUIRED</prop>
</props>
再测,正常
虽然问题解决了,但是还有一些疑惑,直接调用hibernate时,如果不使用事务,程序会抛异常,使用spring的声明式事务后,为什么就不会报错,需要看源代码解决
spring+hibernate--直接修改数据库,再通过hibernate查询数据不变的更多相关文章
- [转]eclipse借助hibernate tool从数据库逆向生成Hibernate实体类
如何从数据库逆向生成Hibernate实体类呢??? 1. 首先,要在eclipse中采用自带的数据库管理器(Data Management),连通你的数据库: 然后选择数据库,这里用的oracle, ...
- 使用Hibernate Tools从数据库逆向生成Hibernate实体类
自动生成model.java.*.hbm.xml 甚至是dao.java.*.ddl.*.html等等.一般也就如下三种方式1. MyEclipse 自带插件2. jboss的 hibernate-t ...
- Hibernate框架的基本搭建(一个小的java project的测试向数据库中插入和查询数据的功能)
Hibernate介绍:Hibernate是一种“对象-关系型数据映射组件”,它使用映射文件将对象(object)与关系型数据(Relational)相关联,在Hibernate中映射文件通常以&qu ...
- 基于Spring Boot,使用JPA动态调用Sql查询数据
在<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>,<基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合 ...
- nodejs 在MYSQL 数据库中插入和查询数据
插入前的数据库: 插入后的数据库: 输出结果: demo var mysql = require('mysql'); var connection = mysql.createConnection({ ...
- Oracle数据库排序后分页查询数据错误问题解决
一.问题描述:根据更新时间倒序排序然后分页查询数据,但是点击分页操作的时候,会出现数据重复看似没有操作的情况 二.问题错误原因分析 分页查询的SQL语句: select * FROM (select ...
- 关于Hibernate性能优化之 FetchType=Lazy时查询数据
当表A和表B一对多的关系 对于A和B的实体类,设置FetchType=EAGER时,取A表数据,对应B表的数据都会跟着一起加载,优点不用进行二次查询.缺点是严重影响数据查询的访问时间. 解决办法Fet ...
- Spring Boot 启动以后然后再加载缓存数据 CommandLineRunner
实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRu ...
- flask-sqlalchemy 迁移数据(生成数据库表)与 查询数据
1, 生成表 db.Model主要用于数据库的增删改查操作, 构建表交给db.Table完成 安装 pip install flask-migrate from datetime import dat ...
- 用Java实现向Cassandra数据库中插入和查询数据
所用jar包: 其中jxl.jar和dom4j.jar,jaxen-1.1-beta-6.jar是解析XML文件用的jar包,如果不解析XML文件可以不用. 代码如下: package com.loc ...
随机推荐
- 通过 HTTP 头进行 SQL 注入
在漏洞评估和渗透测试中,确定目标应用程序的输入向量是第一步.有时,当做web应用程序测试时,SQL注入漏洞的测试用例通常局限于特殊的输入向量GET和POST变量.那么对于其他的HTTP头部参数呢?难道 ...
- 在win7电脑中如何查看运行进程的PID标识符
在介绍技巧方法之前,咱们还是先来介绍一下什么是PID标识符,这个PID标识符就是系统对运行中的程序自动分配的一个编号,是用来识别对应进程的,而且这个编号也是一一对应,不会有重复的,只有当系统结束运行的 ...
- Porlet标准:JSR168/JSR286/WSRP(转载)
From:http://www.iteye.com/topic/620213 Portlet标准主要是JSR168,JSR286和WSRP. JSR168因为比较早,所以大部分的Portal都支持这个 ...
- spring循环引用的问题
很久没写技术贴了,这两天被spring的循环引用搞死了,发文记之. 前几天,项目结构做了调整,把我所在的项目代码嵌入另一个项目,然后就杯具了,症状如下: Bean with name ‘xxxServ ...
- centos7安装mysql
centos7安装mysql 1 查找系统是否安装了myql rpm -q mysql mysql-server1.1如果安装了.就删除 sudo yum -y remove mysql mysql- ...
- PXE批量部署linux操作系统
前言 在实际生产环境中,有时候我们会碰到为几十上百甚至上千台服务器安装Linux操作系统的需求,如果我们还是常规的去使用移动介质逐台安装,显然是一件低效又令人抓狂的事情,那要安装到何年何月啊?这对于我 ...
- .NET技术+25台服务器怎样支撑世界第54大网站(转)
[编者按]StackOverflow是一个IT技术问答网站,用户可以在网站上 提交和回答问题.当下的StackOverflow已拥有400万个用户,4000万个回答,月PV5.6亿,世界排行第54.然 ...
- position中多次用到了relative和absolute,能不能具体介绍一下这两者的区别?
position中多次用到了relative和absolute,能不能具体介绍一下这两者的区别? 一个是相对定位,一个是绝对定位. absolute生成绝对定位的元素,相对于 static 定位以外的 ...
- 微信红包签名算法 C#代码实现
string stringA = "appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=100001 ...
- esriSRGeoCSType Constants
ArcGIS Developer Help (Geometry) esriSRGeoCSType Constants See Also esriSRGeoCS2Type Constants ...