spring+hibernate--直接修改数据库,再通过hibernate查询数据不变
2013-09-23 18:06
513 查看
这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响。
刚好今天没事,想好好解决一下这个问题。
hibernate主要配置如下:
spring配置:
先写一个测试类,直接使用hibernate:
程序中查询了两次,在第一次和第二次查询之间插入断点,第一次打印结果后,直接往数据库中插入一条记录,再继续执行,发现结果是正常的。
再写一个spring,hibernate的测试类:
打印第一次结果后,直接往数据库中插入数据,再继续执行程序,第二次打印的结果和第一次相同,这是为什么呢?
先看一下hibernate的配置,
这个配置是说把session绑定到本地线程,不需要手动关闭,事务提交时自动关闭。
再看spring配置的事务,只有save和remove结尾的程序才使用事务,看来问题就是在这了。事务没有提交,session没有关闭,一级缓存没有清除。
把配置改一下
再测,正常
虽然问题解决了,但是还有一些疑惑,直接调用hibernate时,如果不使用事务,程序会抛异常,使用spring的声明式事务后,为什么就不会报错,需要看源代码解决
刚好今天没事,想好好解决一下这个问题。
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的声明式事务后,为什么就不会报错,需要看源代码解决
相关文章推荐
- 手动修改数据库的值,hibernate查询还没有显示修改数据原因补充
- 通过查询数据库中的数据匹配在页面上:(set单条数据属性是在页面上的显示与foreach的不同) 通过ID修改提取位置表信息
- Spring-JDBC:在使用JdbcTemplate进行条件查询时没有返回数据,但是sql直接在数据库中执行是有数据返回的。
- java spring hibernate 按日期查询数据库中 数据
- 重置mysql Root用户密码及修改默认字符集一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。 解决
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- spring 通过传递多个参数查询数据库
- 【转载】struts+spring+hibernate无法插入数据库数据的问题
- Hibernate动态建表,通过hbm.xml配置文件创建数据表,进行数据库操作, 动态模型
- Hibernate的hql语句查询不到内容,但是库里有数据,直接执行SQL也能执行,能得到值,返回值取不到
- C#中通过OLE方式连接informix数据库与查询数据方式
- Android开发—数据库应用—访问数据表(SQLite OpenHelper) —查询单条记录、修改
- 通过loadrunner 11常规通用的C语言API类型的Vuser 方式,测试验证MySQL数据库插入、查询、修改、删除数据性能脚本实例
- Spring、Hibernate 数据不能插入到数据库问题解决
- springMVC+ibaties 分页查询数据时 提示错误 将语句复制到数据库进行编译 报错为ORA-00918: column ambiguously defined
- 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询参照:对数据进行增删改查)
- 转载!!!Hibernate插入和修改数据到数据库中时不修改存在默认值字段
- 用maven整合struts+spring+hibernate之二 数据库生成和测试数据
- Spring boot + maven + hibernate 实现数据库连接、查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询