博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring+hibernate--直接修改数据库,再通过hibernate查询数据不变
阅读量:5104 次
发布时间:2019-06-13

本文共 4374 字,大约阅读时间需要 14 分钟。

这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响。

刚好今天没事,想好好解决一下这个问题。

hibernate主要配置如下:

1         
true
2
3 jdbc:mysql://localhost:3306/vipmf?autoReconnect=true&useUnicode=true&characterEncoding=utf-8 4
5
root
6
123456
7
8 com.mysql.jdbc.Driver 9
10
false
11
true
12
13 org.hibernate.dialect.MySQLDialect14
15
16 thread17
18
19 false 20

spring配置:

classpath:hibernate.cfg.xml
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
*Service
transactionInterceptor

先写一个测试类,直接使用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
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的配置,

thread

这个配置是说把session绑定到本地线程,不需要手动关闭,事务提交时自动关闭。

再看spring配置的事务,只有save和remove结尾的程序才使用事务,看来问题就是在这了。事务没有提交,session没有关闭,一级缓存没有清除。

把配置改一下

PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED

再测,正常

虽然问题解决了,但是还有一些疑惑,直接调用hibernate时,如果不使用事务,程序会抛异常,使用spring的声明式事务后,为什么就不会报错,需要看源代码解决

posted on
2013-09-23 18:06 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/yinkh/p/3335387.html

你可能感兴趣的文章
PhotoZoom放大图片,真的能无损吗?
查看>>
转载分享移动网站最佳实践
查看>>
spark--环境搭建--4.ZooKeeper345集群搭建
查看>>
Codeforces Round #426 (Div. 2) C. The Meaningless Game
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
leetcode - Next Permutation
查看>>
C#创建Windows服务程序
查看>>
Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
iframe跨域与session失效问题
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
Hash和Bloom Filter
查看>>
SQL Server获取月度列表
查看>>
python常用函数
查看>>