📅  最后修改于: 2021-01-02 16:00:14             🧑  作者: Mango
休眠面试问题被问到学生,因为它是一种广泛使用的ORM工具。下面列出了针对初学者和专业人员的20个最冬眠面试问题和答案的重要列表。
Hibernate是一个开源的轻量级ORM工具,用于存储,操作和从数据库检索数据。
ORM是对象/关系映射的首字母缩写。将对象与数据库中存储的数据进行映射是一种编程策略。它简化了数据创建,数据处理和数据访问。
Hibernate体系结构由许多接口组成,例如Configuration,SessionFactory,Session,Transaction等。
Hibernate框架的核心接口是:
与JDBC相比,ORM具有以下优点:
条件的对象用于创建和执行面向对象的条件查询。
Hibernate支持的一些数据库是:
Hibernate的关键组件是:
数据库连接
类映射设置
SQL查询是通过以下语法创建的:
Session.createSQLQuery
休眠查询语言
使用以下语法创建HQL查询:
Session.createQuery
使用Session.createCriteria将条件添加到SQL查询。
对象存储在数据库表中的类称为持久性类。
SessionFactory提供Session的实例。这是Session的工厂。它保存默认情况下未启用的二级缓存的数据。
是的,SessionFactory是线程安全的对象,许多线程无法同时访问它。
它维护了休眠应用程序和数据库之间的连接。
它提供了从数据库存储,更新,删除或获取数据的方法,例如persist(),update(),delete(),load(),get()等。
它是Query,Criteria和Transaction的工厂,即它提供了工厂方法来返回这些实例。
不,Session不是线程安全的对象,许多线程可以同时访问它。换句话说,您可以在线程之间共享它。
No. | save() | persist() |
---|---|---|
1) | returns the identifier (Serializable) of the instance. | Return nothing because its return type is void. |
2) | Syn: public Serializable save(Object o) | Syn: public void persist(Object o) |
下面给出了get()和load()方法之间的区别。
No. | get() | load() |
---|---|---|
1) | Returns null if an object is not found. | Throws ObjectNotFoundException if an object is not found. |
2) | get() method always hit the database. | load() method doesn’t hit the database. |
3) | It returns the real object, not the proxy. | It returns proxy object. |
4) | It should be used if you are not sure about the existence of instance. | It should be used if you are sure that instance exists. |
下面给出了update()和merge()方法之间的区别。
No. | The update() method | merge() method |
---|---|---|
1) | Update means to edit something. | Merge means to combine something. |
2) | update() should be used if the session doesn’t contain an already persistent state with the same id. It means an update should be used inside the session only. After closing the session, it will throw the error. | merge() should be used if you don’t know the state of the session, means you want to make the modification at any time. |
让我们尝试通过下面的示例来了解差异:
...
SessionFactory factory = cfg.buildSessionFactory();
Session session1 = factory.openSession();
Employee e1 = (Employee) session1.get(Employee.class, Integer.valueOf(101));//passing id of employee
session1.close();
e1.setSalary(70000);
Session session2 = factory.openSession();
Employee e2 = (Employee) session1.get(Employee.class, Integer.valueOf(101));//passing same id
Transaction tx=session2.beginTransaction();
session2.merge(e1);
tx.commit();
session2.close();
关闭session1后,e1处于分离状态。它不会在session1缓存中。因此,如果调用update()方法,它将引发错误。
然后,我们打开了另一个会话并加载了相同的Employee实例。如果我们在session2中调用merge,则e1的更改将在e2中合并。
休眠中的对象(实例)有3种状态。
休眠中有3种继承映射方式。
如果将一个类标记为mutable =“ false”,则该类将被视为不可变类。默认情况下,它是mutable =“ true”。
Hibernate的自动脏检查功能会在事务中修改的对象上自动调用update语句。
让我们通过以下示例了解它:
...
SessionFactory factory = cfg.buildSessionFactory();
Session session1 = factory.openSession();
Transaction tx=session2.beginTransaction();
Employee e1 = (Employee) session1.get(Employee.class, Integer.valueOf(101));
e1.setSalary(70000);
tx.commit();
session1.close();
在这里,获取雇员实例e1之后,我们将更改e1的状态。
更改状态后,我们将提交事务。在这种情况下,状态将自动更新。这被称为休眠中的脏检查。
休眠中可以有4种类型的关联映射。
不可以,只能使用一对多和多对多执行收集映射。
休眠中的延迟加载可提高性能。它按需加载子对象。
从Hibernate 3开始,默认情况下启用了延迟加载,您无需执行lazy =“ true”。这意味着在加载父对象时不加载子对象。
休眠查询语言被称为面向对象的查询语言。它就像结构化查询语言(SQL)。
HQL相对于SQL的主要优点是:
No. | First Level Cache | Second Level Cache |
---|---|---|
1) | First Level Cache is associated with Session. | Second Level Cache is associated with SessionFactory. |
2) | It is enabled by default. | It is not enabled by default. |