个性化阅读
专注于IT技术分析

最新JPA面试题和知识点整理

本文概述

JPA面试问题

以下列出了JPA面试中最常见的问题和解答:

1)什么是Java Persistence API?

Java Persistence API(JPA)是Java的规范, 用于在Java对象和关系数据库之间持久化数据。 JPA充当面向对象的域模型和关系数据库系统之间的桥梁。由于JPA只是一个规范, 因此它本身不会执行任何操作。它需要一个实现。因此, 诸如Hibernate, TopLink和iBatis之类的ORM工具实现了JPA规范以实现数据持久性。 Java Persistence API的第一个版本JPA 1.0于2006年发布, 它是EJB 3.0规范的一部分。


2)JPA是否执行诸如访问, 保留和管理数据之类的实际任务?

不, JPA只是一个规范。 Hibernate, iBatis和TopLink等ORM工具实现JPA规范并执行这些类型的任务。


3)什么是对象关系映射?

对象关系映射是一种机制, 用于通过将对象状态映射到数据库列中来开发和维护对象与关系数据库之间的关系。它将编程代码的属性转换为表的列。它能够轻松处理各种数据库操作, 例如插入, 更新, 删除等。

JPA对象关系映射

4)JPA的优点是什么?

JPA的优点如下。

  • 通过使用JPA, 与数据库交互的负担大大降低。
  • 隐藏O / R映射和数据库访问处理, 使用户编程变得容易。
  • 通过使用注释可以减少创建定义文件的成本。
  • 我们可以合并使用其他JPA提供程序的应用程序
  • 使用不同的实现可以将功能添加到标准实现中, 以后可以成为JPA规范的一部分。

5)有哪些可嵌入类?

可嵌入类表示实体的状态, 但没有自己的持久标识。这样的类的对象共享拥有它的实体类的标识。实体可以具有单值或多值可嵌入类属性。


6)列出一些ORM框架。

以下是在ORM机制上起作用的各种框架:-

  • 冬眠
  • 顶联
  • ORMLite
  • iBATIS
  • JPOX

7)什么是JPQL?

JPQL是JPA规范中定义的Java Persistence查询语言。它用于构造查询。

8)持久化实体对象的步骤是什么?

执行以下步骤以持久化实体对象。

创建一个实体管理器工厂对象。 java.persistence包中存在的EntityManagerFactory接口用于提供实体管理器。

EntityManagerFactory emf=Persistence.createEntityManagerFactory("Student_details");

从工厂获取实体经理。

EntityManager em=emf.createEntityManager();

初始化实体管理器。

em.getTransaction().begin();

将数据持久化到关系数据库中。

em.persist(s1);

完成交易

em.getTransaction().commit();

释放工厂资源。

emf.close();
	em.close();

9)插入实体有哪些步骤?

我们可以轻松地通过实体将数据插入数据库。 EntityManager提供了persist()方法来添加记录。以下步骤用于将记录插入数据库。

创建一个具有属性Student_name的实体类, 例如Student.java。

package com.srcmini.jpa.student;
import javax.persistence.*;

@Entity
@Table(name="student")
public class Student {

	@Id
	private String s_name;
	
	public StudentEntity(String s_name) {
		super();
		this.s_name = s_name;
	}

	public StudentEntity() {
		super();
	}

	public String getS_name() {
		return s_name;
	}

	public void setS_name(String s_name) {
		this.s_name = s_name;
	}
}

现在, 在Persistence.xml文件中映射实体类和其他数据库配置。

<persistence>
<persistence-unit name="Student_details">
	
	<class>com.srcmini.jpa.student.StudentEntity</class>

<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/studentdata"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="eclipselink.logging.level" value="SEVERE"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>

	</persistence-unit>
</persistence>

在com.srcmini.jpa.persist包下创建一个名为PersistStudent.java的持久性类, 以将实体对象与数据持久化

package com.srcmini.jpa.persist;

import com.srcmini.jpa.student.*;
import javax.persistence.*;
public class PersistStudent {
	
	public static void main(String args[])
	{
		
		EntityManagerFactory emf=Persistence.createEntityManagerFactory("Student_details");
		EntityManager em=emf.createEntityManager();
		
em.getTransaction().begin();
		
		StudentEntity s1=new StudentEntity();
		s1.setS_name("Gaurav");
		em.persist(s1);
		em.getTransaction().commit();
		emf.close();
		em.close();
	}
}

10)寻找实体的步骤是什么?

要查找实体, EntityManger接口提供了find()方法, 该方法通过主键搜索元素。以下步骤用于在记录中查找实体。

在com.srcmini.jpa.student包下创建一个名为StudentEntity.java的实体类, 其中包含属性s_name。

package com.srcmini.jpa.student;
import javax.persistence.*;

@Entity
@Table(name="student")
public class StudentEntity {

	@Id
	private String s_name;
	private int s_id;
	public StudentEntity(String s_name, int s_id) {
		super();
		this.s_name = s_name;
		this.s_id = s_id;
	}

	public StudentEntity() {
		super();
	}

	
	public String getS_id() {
		return s_id;
	}

	public void setS_id(int s_id) {
		this.s_name = s_id;
	}
	public String getS_name() {
		return s_name;
	}

	public void setS_name(String s_name) {
		this.s_name = s_name;
	}
}

现在, 在Persistence.xml文件中映射实体类和其他数据库配置。

<persistence>
<persistence-unit name="Student_details">
	
	<class>com.srcmini.jpa.student.StudentEntity</class>

<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/studentdata"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="eclipselink.logging.level" value="SEVERE"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>

	</persistence-unit>
</persistence>

在com.srcmini.jpa下创建一个名为FindStudent.java的持久性类。查找包以将实体对象与数据持久化。

package com.srcmini.jpa.find;
import javax.persistence.*;

import com.srcmini.jpa.student.*;

public class FindStudent {
	public static void main(String args[])
	{
		EntityManagerFactory emf=Persistence.createEntityManagerFactory("Student_details");
		EntityManager em=emf.createEntityManager();
		
	
		
		StudentEntity s=em.find(StudentEntity.class, 101);
		
		System.out.println("Student id = "+s.getS_id());
		System.out.println("Student Name = "+s.getS_name());
		System.out.println("Student Age = "+s.getS_age());
		
	}
}

11)更新实体有哪些步骤?

JPA允许我们通过更新实体来更改数据库中的记录。将执行以下步骤来更新实体。

在com.srcmini.jpa.student包下创建一个名为StudentEntity.java的实体类, 其中包含属性s_id和s_name。

StudentEntity.java

package com.srcmini.jpa.student;
import javax.persistence.*;

@Entity
@Table(name="student")
public class StudentEntity {

	@Id
	private String s_name;
	private int s_id;
	public StudentEntity(String s_name, int s_id) {
		super();
		this.s_name = s_name;
		this.s_id = s_id;
	}

	public StudentEntity() {
		super();
	}

	
	public String getS_id() {
		return s_id;
	}

	public void setS_id(int s_id) {
		this.s_name = s_id;
	}
	public String getS_name() {
		return s_name;
	}

	public void setS_name(String s_name) {
		this.s_name = s_name;
	}
}

现在, 在Persistence.xml文件中映射实体类和其他数据库配置。

Persistence.xml

<persistence>
<persistence-unit name="Student_details">
	
	<class>com.srcmini.jpa.student.StudentEntity</class>

<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/studentdata"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="eclipselink.logging.level" value="SEVERE"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>

	</persistence-unit>
</persistence>

在com.srcmini.jpa.update包下创建一个名为UpdateStudent.java的持久性类, 以将实体对象与数据持久化。

UpdateStudent.java

package com.srcmini.jpa.update;
import javax.persistence.*;

import com.srcmini.jpa.student.*;
public class UpdateStudent {
	
	public static void main(String args[])
	{
		EntityManagerFactory emf=Persistence.createEntityManagerFactory("Student_details");
		EntityManager em=emf.createEntityManager();
		StudentEntity s=em.find(StudentEntity.class, 102);
		System.out.println("Before Updation");
		System.out.println("Student Name = "+s.getS_name());
		s.setName("Ayush");
		System.out.println("After Updation");
		System.out.println("Student Name = "+s.getS_name());
	}
}

12)删除实体有哪些步骤?

要从数据库中删除一条记录, EntityManager接口提供了remove()方法。 remove()方法使用主键删除特定记录。将执行以下示例以删除实体。

在com.srcmini.jpa.student包下创建一个名为StudentEntity.java的实体类, 其中包含属性s_id和s_name。

package com.srcmini.jpa.student;
import javax.persistence.*;

@Entity
@Table(name="student")
public class StudentEntity {

	@Id
	private int s_id;
	private String s_name;
	
	public StudentEntity(int s_id, String s_name) {
		super();
		this.s_id = s_id;
		this.s_name = s_name;
	}

	public StudentEntity() {
		super();
	}

	public int getS_id() {
		return s_id;
	}

	public void setS_id(int s_id) {
		this.s_id = s_id;
	}

	public String getS_name() {
		return s_name;
	}

	public void setS_name(String s_name) {
		this.s_name = s_name;
	}	
}

现在, 在Persistence.xml文件中映射实体类和其他数据库配置。

Persistence.xml

<persistence>
<persistence-unit name="Student_details">
	
	<class>com.srcmini.jpa.student.StudentEntity</class>

<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/studentdata"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="eclipselink.logging.level" value="SEVERE"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>

	</persistence-unit>
</persistence>

Deletion.java

package com.srcmini.jpa.delete;
import javax.persistence.*;
import com.srcmini.jpa.student.*;

public class DeleteStudent {

	public static void main(String args[])
	{
	EntityManagerFactory emf=Persistence.createEntityManagerFactory("Student_details");
	EntityManager em=emf.createEntityManager();
em.getTransaction().begin();

    StudentEntity s=em.find(StudentEntity.class, 102);
em.remove(s);
em.getTransaction().commit();
emf.close();
em.close();

	}
}

13)使用JPA插入记录机制?

@Override
@Transactional
public void create(Category entity) throws MeetingAppDAOException {
try {
logger.info("Enter - create()");
super.create(entity);
logger.info("Exit - create()");
} catch (PersistenceException exception) {
logger.error("create()::REASON OF EXCEPTION=" + exception.getMessage(), e);
}
}

14)实体映射的不同方向是什么?

映射的方向可以是单向或双向的。在单向映射中, 只能将一个实体映射到另一实体, 而在双向映射中, 可以将每个实体映射或引用到另一实体。


15)实体映射有哪些不同类型?

以下是对象关系映射的类型:-

  • 一对一映射:一对一映射表示单值关联, 其中一个实体的实例与另一个实体的实例关联。在这种类型的关联中, 源实体的一个实例可以与目标实体的最多一个实例进行映射。
  • 一对多映射:一对多映射属于集合值关联的类别, 其中一个实体与其他实体的集合相关联。在这种类型的关联中, 一个实体的实例可以与另一个实体的任意数量的实例进行映射。
  • 多对一映射多对一映射表示单值关联, 其中实体的集合可以与相似实体关联。在关系数据库中, 一个实体的多个行可以引用另一个实体的同一行。
  • 多对多映射多对多映射表示集合值关联, 其中任何数量的实体都可以与其他实体的集合关联。在关系数据库中, 一个实体的多于一行可以引用另一实体的多于一行。

16)什么是映射中的孤立删除?

如果将一对一或一对多映射中的目标实体从映射中删除, 则可以将删除操作级联到该目标实体。此类目标实体称为孤立实体, 并且orphanRemoval属性可用于指定应删除孤立实体。


17)解释对象的持久性生命周期?

在持久性生命周期中, 对象处于以下状态:-

  • 瞬态-当仅通过使用new关键字声明该对象时, 该对象被称为处于瞬态。当一个对象保持过渡状态时, 它在数据库中不包含任何标识符(主键)。
  • 持久性-在这种状态下, 对象与会话相关联, 并保存到数据库或从数据库中检索。当对象保持持久性状态时, 它包含数据库的一行并由标识符值组成。我们可以通过将对象与休眠会话相关联来使对象持久化。
  • 已分离-当休眠会话关闭时, 对象进入分离状态。对分离的对象所做的更改不会保存到数据库中。

18)标识符生成有哪些不同类型?

以下是使用@GeneratedValue批注指定所需的ID生成策略的类型:-

  • 自动ID生成-在这种情况下, 应用程序不关心ID生成的种类, 而是将这项任务移交给提供商。如果未明确指定任何值, 则生成类型默认为自动。
  • 使用表生成ID-标识符也可以使用数据库表生成。
  • 使用数据库序列生成ID-数据库支持一种内部的ID生成机制, 称为序列。要自定义数据库序列名称, 我们可以使用JPA @SequenceGenerator批注。
  • 使用数据库标识生成ID-在这种方法中, 每当将一行插入表中时, 都会向标识列分配一个唯一的标识符, 该标识符可用于生成对象的标识符。

19)什么是实体?

实体是在单个单元中关联在一起的一组状态。实体充当对象, 并成为面向对象范式的主要组成部分。换句话说, 我们可以说实体是Java持久性库中应用程序定义的对象。每个实体都与元数据相关联, 该元数据以XML或注释的形式表示其信息。


20)实体的属性是什么?

以下是对象必须具有的实体的属性:-

  • 持久性:如果对象存储在数据库中并且可以随时访问, 则称为持久性。
  • 持久身份:在Java中, 每个实体都是唯一的, 代表一个对象身份。类似地, 当对象标识存储在数据库中时, 则将其表示为持久性标识。该对象标识等同于数据库中的主键。
  • 事务性:在Java中, 每个实体都是唯一的, 并代表一个对象身份。类似地, 当对象标识存储在数据库中时, 则将其表示为持久性标识。该对象标识等同于数据库中的主键。
  • 粒度:实体不应该是具有一维状态的基本体, 基本包装器或内置对象。

21)实体管理器在JPA中的作用是什么?

实体经理负责以下操作。

  • 实体管理器实现API, 并将所有API封装在一个接口中。
  • 实体管理器用于读取, 删除和写入实体。
  • 实体引用的对象由实体管理器管理。

22)对实体类的约束是什么?

实体类必须满足以下要求:

  • 该类必须具有无参数构造函数。
  • 该课程不能为期末考试。
  • 该类必须使用@Entity注释进行注释。
  • 如果value将空实例作为分离的对象传递, 则该类必须实现Serializable接口。

23)JPA中Java集合的目的是什么?

在JPA中, Java集合用于持久化包装类和String的对象。


24)可以在JPA集合映射中存储哪些类型的对象?

以下是JPA允许存储的对象类型:-

  • 基本类型
  • 实体
  • 可嵌入

25)JPA中可以使用哪种类型的集合?

为了存储多值实体关联和对象集合, 使用了以下类型的Java集合:-

  • list
  • 地图

26)在JPA中进行级联操作的目的是什么?

如果我们将任何任务应用到一个实体, 然后使用级联操作, 那么它也将适用于其相关实体。


27)JPA支持哪些级联类型?

以下是级联类型的列表:-

  • 持久性:在此级联操作中, 如果父实体被持久化, 则其所有相关实体也将被持久化。
  • 合并:在此级联操作中, 如果父实体被合并, 则其所有相关实体也将被合并。
  • 分离:在此级联操作中, 如果父实体被分离, 那么其所有相关实体也将被分离。
  • 刷新:在此级联操作中, 如果父实体被刷新, 那么其所有相关实体也将被刷新。
  • 删除:在此级联操作中, 如果父实体被删除, 则其所有相关实体也将被删除。
  • 全部在这种情况下, 上述所有层叠操作都可以应用于与父实体相关的实体。

28)什么是JPQL?

Java持久性查询语言(JPQL)是JPA规范的一部分, 该规范定义了针对持久性实体的搜索。它是一种面向对象的查询语言, 用于对持久性实体执行数据库操作。 JPQL使用实体对象模型代替数据库表来操作SQL查询。在这里, JPA的作用是将JPQL转换为SQL。因此, 它为开发人员提供了一个轻松的平台来处理SQL任务。 JPQL是对Entity JavaBeans查询语言(EJBQL)的扩展。


29)JPQL有什么功能?

JPQL的一些基本功能是:-

  • 它既简单又健壮。
  • 它是与平台无关的查询语言。
  • JPQL查询可以在元数据中静态声明, 也可以在代码中动态构建。
  • 它可以与任何数据库一起使用, 例如MySQL, Oracle。

30)什么是Criteria API?

Criteria API是一种规范, 提供使用Java编程语言API编写的类型安全和可移植的条件查询。它是构造实体及其持久状态查询的最常用方法之一。它只是定义JPA查询的另一种方法。 Criteria API定义了独立于平台的标准查询, 以Java编程语言编写。它是在JPA 2.0中引入的。其背后的主要目的是提供一种类型安全的方式来表达查询。


HTML面试问题
SQL面试题
Android面试题
MySQL面试问题
Java OOP面试问题
休眠面试问题

SEO面试问题

PL / SQL面试问题

Oracle面试问题

SQL Server面试问题

Java基础面试问题

春季面试问题

赞(0)
未经允许不得转载:srcmini » 最新JPA面试题和知识点整理

评论 抢沙发

评论前必须登录!