java高频面试题,java高级面试题及答案

  java高频面试题,java高级面试题及答案

  一、什么是ORM?

  对象关系映射(ORM)是一种解决程序的面向对象模型与数据库的关系模型不匹配问题的技术。

  简单地说,ORM自动将程序中的对象持久化到关系数据库中,或者通过使用描述对象和数据库之间映射的元数据(XML或Java中的注释)将关系数据库表中的行转换成Java对象。本质上,ORM将数据从一种形式转换成另一种形式。

  二、Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?

  Session对应于Hibernate的一个数据存储概念,它是线程安全的,可以被多个线程并发访问。SessionFactory通常只在启动时构建。对于应用程序,最好通过singleton模式封装SessionFactory,以便于访问。

  (学习视频推荐:java视频教程)

  Session是一个轻量级的非线程安全对象(线程之间不能共享任何会话)。它表示与数据库交互的工作单元。会话是由SessionFactory创建的,它将在任务完成后关闭。会话是持久层服务提供的主要接口。

  会话将延迟数据库连接的获取(即,仅在需要时获取)。为了避免创建太多的会话,您可以使用ThreadLocal将会话绑定到当前线程,以便同一个线程总是获得同一个会话。Hibernate 3中SessionFactory的getCurrentSession()方法可以做到。

  三、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?

  Hibernate对象有三种状态:瞬态、持久和分离。

  瞬态的实例可以通过调用save()、persist()或saveOrUpdate()方法变成持久状态;

  处于自由状态的实例可以通过调用update()、saveOrUpdate()、lock()或replicate()成为持久状态。Save()和persist()将触发SQL的INSERT语句,而update()或merge()将触发UPDATE语句。

  save()和update()的区别在于,一个是把瞬态对象变成持久对象,一个是把自由对象变成持久对象。merge()方法可以完成save()和update()方法的功能,其意图是将新的状态合并到现有的持久对象中,或者创建一个新的持久对象。

  对于persist()方法,请遵循官方文档的说明:

  1.persist()方法持久化一个瞬态的实例,但不保证标识符会立即填充到持久化实例中,标识符的填充可能会延迟到刷新时间;

  2.persist()方法确保在事务外部调用它时,不会触发INSERT语句。当需要封装长会话流程时,persist()方法是必要的;

  (推荐教程:java快速入门)

  3.save()方法不保证第2条,它返回标识符,所以它会立即执行INSERT语句,不管是在事务内部还是外部。至于lock()方法和update()方法的区别,update()方法是把一个已经改变了失控状态的对象变成持久状态;lock()方法是让一个处于不变失控状态的对象变成持久状态。

  四、阐述Session加载实体对象的过程

  1.在调用数据库查询函数之前,Session将首先在一级缓存中搜索实体类型和主键。如果一级缓存搜索命中,且数据状态合法,则直接返回;

  2.如果在一级缓存中没有命中,那么Session会在当前的NonExists记录中进行搜索(相当于一个查询黑名单,如果有重复的无效查询,可以快速做出判断,从而提高性能)。如果非Exists中存在相同的查询条件,将返回null;

  3.如果一级缓存查询失败,则查询二级缓存,如果二级缓存命中,则直接返回;

  4.如果前面的查询都没有命中,则发送一条SQL语句。如果在查询中没有找到相应的记录,则将该查询添加到要记录的会话的非Exists中,并返回null;

  5.根据映射配置和SQL语句获取结果集,并创建相应的实体对象;

  6.将对象纳入会话(一级缓存)管理;

  7.如果有对应的拦截器,执行拦截器的onLoad方法;

  8.如果要使用二级缓存开启并设置,则将数据对象带入二级缓存;

  9.返回数据对象。

  五、MyBatis中使用#和$书写占位符有什么区别?

  #将所有传入数据视为字符串,它会自动引用传入数据;

  $传入的数据直接在SQL中显示和生成。

  注意:使用$占位符可能会导致SQL注入攻击。不要在可以使用#的地方使用$符号。编写order by子句时,应该使用$而不是#。

  相关教程推荐:java面试问题以上是java持久性面试题目(1)的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: