zoukankan      html  css  js  c++  java
  • Hibernate常见面试题

    1、什么是Hibernate的并发机制?怎么去处理并发问题? 

     Hibernate并发机制:

     a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,  然后就丢弃。 

          如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。 

         如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击浏览器的“刷新”,  就会导致两个并发运行的线程使用同一个Session。  
    b、多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。

    解决方案:设置事务隔离级别。  
        Serializable:串行化。隔离级别最高  
        Repeatable Read:可重复读  
        Read Committed:已提交数据读  
        Read Uncommitted:未提交数据读。隔离级别最差  
        设置锁:乐观锁和悲观锁。  
        乐观锁:使用版本号或时间戳来检测更新丢失,在的映射中设置 optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态 行级悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;

    2、update和saveOrUpdate的区别?

      update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。  
      update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。  
      saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会  更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中。

    3、hibernate的三种状态之间如何转换  
      当对象由瞬时状态(Transient)一save()时,就变成了持久化状态;  
      当我们在Session里存储对象的时候,实际是在Session的Map里存了一份,  也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。  Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了,这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。  
      当游离状态(Detached)update()时,又变为了持久状态(Persistent)。  
      当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient), 此时,数据库中没有与之对应的记录。

     请参见:http://itindex.net/detail/40384-hibernate-%E9%9D%A2%E8%AF%95

  • 相关阅读:
    云HBase发布全文索引服务,轻松应对复杂查询
    eclipse调试断点
    IntelliJ IDEA使用小技巧
    jQuery遍历not的用法
    request.querystring和request.form的区别
    ppt打不开,显示发现文件中的内容有问题。可尝试修复此演示文稿
    中文乱码 encodeURI来解决URL传递时的中文问题
    Http请求中Content-Type讲解以及在Spring MVC中的应用
    Display Tag Lib Table进行分页
    js刷新页面
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5565468.html
Copyright © 2011-2022 走看看