1 为什么要使用 hibernate?
? 使用Hibernate的主要原因是提供了一种方便、高效的对象关系映射(ORM)解决方案。
?它能够将Java对象与数据库表之间建立映射关系,
?简化了数据库访问操作,并提供了事务管理和缓存机制等功能。
2 什么是 ORM 框架?
ORM框架(对象关系映射框架)是一种用于将面向对象的编程语言中的对象模型与关系型数据库之间进行映射的技术。
它能够自动处理对象与数据库之间的转换,
使开发人员可以使用面向对象的方式进行数据库操作,而不需要直接编写SQL语句。
3 hibernate 中如何在控制台查看打印的 sql 语句?
在Hibernate中,可以通过配置来打印SQL语句到控制台。在Hibernate配置文件中,设置"show_sql"属性为true即可将执行的SQL语句输出到控制台
4 hibernate 有几种查询方式?
Hibernate提供了多种查询方式,包括HQL(Hibernate Query Language)、Criteria查询和本地SQL查询。其中,HQL是Hibernate特有的查询语言,类似于SQL但更面向对象;Criteria查询是一种面向对象的查询方式,
通过Criteria API可以动态构建查询条件;本地SQL查询则是直接使用SQL语句进行查询。
5 hibernate 实体类可以被定义为 final 吗?
Hibernate的实体类可以被定义为final,但不推荐这样做。如果将实体类定义为final,Hibernate在运行时无法生成代理对象,可能会影响性能和某些功能,如延迟加载。通常情况下,最好将实体类定义为可继承的。
6 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
在Hibernate中,使用Integer和int做映射的区别在于处理null值的方式。当使用Integer作为属性类型时,可以将null值存储到数据库中;而使用int作为属性类型时,Hibernate会将null值转换为默认值0进行存储。
7 hibernate 是如何工作的?
Hibernate通过对象关系映射(ORM)技术,将Java对象与数据库表之间建立了映射关系。它通过配置文件和注解来描述对象与表的映射规则,自动完成对象与数据库之间的转换和持久化操作。当应用程序需要访问数据库时,Hibernate会根据配置信息生成SQL语句并执行,最后将查询结果转化为Java对象返回给应用程序。
8 get()和 load()的区别?
在Hibernate中,get()和load()都用于根据主键获取持久化对象。区别在于当对象不存在时,get()方法返回null,而load()方法抛出异常。另外,load()方法在实际使用时是延迟加载的,只有在访问对象属性时才会触发真正的数据库查询。
9 说一下 hibernate 的缓存机制?
Hibernate的缓存机制是为了提高性能而引入的。它分为一级缓存(Session级别)和二级缓存(SessionFactory级别)。一级缓存是默认开启的,可以减少数据库访问次数,提高性能。二级缓存是可选的,可以跨越多个Session共享缓存数据,更进一步提升性能。
10 hibernate 对象有哪些状态?
Hibernate对象有三种状态:瞬时态(Transient)、持久态(Persistent)和游离态(Detached)。瞬时态表示对象没有关联到数据库,持久态表示对象已经被保存到数据库中并与Session关联,游离态表示对象曾经与Session关联过,但已经脱离了Session的管理。
11 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
getCurrentSession()和openSession()都可以获取一个Session对象用于数据库操作。区别在于getCurrentSession()方法会自动管理Session的生命周期,它使用当前线程绑定的Session,适用于事务边界清晰的场景;而openSession()方法需要手动管理Session的生命周期,适用于长时间的会话操作。
12 hibernate 实体类必须要有无参构造函数吗?为什么?
Hibernate要求实体类必须要有无参构造函数。这是因为Hibernate在从数据库中加载实体对象时,需要通过无参构造函数创建对象实例,并通过Setter方法设置属性值。如果没有无参构造函数,Hibernate将无法正确创建实体对象,导致操作失败。