比较深入的hibernate问题, 谢谢大家的讨论!

ABC123CBA321 2010-01-23 10:48:47
总共有三条关于hibernate的深入问题, 请高手帮忙解答, 谢谢!


请先看以下hibernate示例:


// 在数据库里有2张表(teacher和student)

Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();

Teacher t = new Teacher();
t.setName("t1");

Student s = new Student();
s.setName("s1");

t.save(t);
s.save(s);
tx.commit();
} finally {
if(null != session)
session.close();
}




第一个问题: 当事务提交后之后, hibernate先把该对象放入一级缓存中再放入数据库吗? 还是先放入数据库再放入一级缓存?

第二个问题: 一本著名的hibernate书上说:"当一个瞬时状态的对象调用save方法后会进入持久化状态, 同时hibernate会将该对象放入一级缓存的map集合当中. session的一级缓存里有个map集合, 该map集合的key存放的是整型的OID值, 此OID必须是唯一的, 专门用来标识不同的对象, 如果该对象在save操作之前数据库里没有记录, 那么该对象的OID值是1"
我的疑惑是, 当以上2个对象被save之后, hibernate会把他们放入map集合里去, 但是他们在数据库里都没有初始的记录, 难道他们在map集合里的OID值都为整型的1吗, 请问该map集合如何区别不同的2个对象?

第三个问题: 一级缓存里的map集合是在commit之后被清除吗?还是在session.close之后才被清除?


分数不多, 只有80分, 倾尽全部求帮忙, 谢谢!
本人是讲师, 需要跟学生们讲课, 请大家抱着严谨的学术态度来回答我的问题, 如不能保证您的回答是绝对正确的, 请别误人子弟, 十分感谢!
...全文
99 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jumpheightway 2010-01-24
  • 打赏
  • 举报
回复
呵呵 有其道 无其道
JavaAlpha 2010-01-23
  • 打赏
  • 举报
回复
JavaAlpha 2010-01-23
  • 打赏
  • 举报
回复
javamode 2010-01-23
  • 打赏
  • 举报
回复
建议自己写程序 eclipse debug 每一行都做了什么很容易就明白了
javamode 2010-01-23
  • 打赏
  • 举报
回复
第一个问题: hibernate的一级缓存也就是session的缓存 事务提交之前一级缓存已经存在该对象,数据库也存在该对象的对应的脏数据,只是没有提交事务,连接到数据库的其他用户无法看到数据。此时事务可以回滚

在session 的save方法未调用之前 如果是一个新对象。那么session先把这个对象保存在session缓存,在这个过程中会根据映射文件配置的主键生成策略生成对象对应的id,对象保存到session缓存后会向在hibernate的sessionFactory缓存中内置缓存中根据对象对应的预定义sql生成sql语句,向数据库发sql
当事务提交时,会默认先执行session.flush()方法清空session缓存 然后提交事务。

第二个问题: hibernate的对象的id是根据主键生成策略生成的,这是在映射文件配置的,既然你是僵尸,这点肯定是要讲的,建议看看主键生成策略。应该就能明白了。

第三个问题: 在hibernate的源码里调用tx.commit()时,会首先调用sesion.flush() 这个时候已经清除了。 这些基本的hibernate书籍上都应该写的有

希望我的回答对你有帮助

如果有错误

希望楼下指证

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧