

图书馆和标准
52.什么是休眠?JPA 和 Hibernate 有什么区别?
要回答这个问题,我想我们首先需要了解JPA是什么。它是一个描述简单 Java 对象的对象关系映射的规范,并提供用于存储、检索和操作此类对象的 API。也就是说,关系数据库 (DB) 表示为一组互连的表。JPA 是一种广泛采用的标准,它描述了对象如何与关系数据库交互。正如您所看到的,JPA 是抽象的、无形的东西。这就像想法本身、方法一样。
53.什么是级联?在Hibernate中是如何使用的?
正如我之前所说,Hibernate 中的通信是通过称为实体的数据对象进行的。这些实体代表数据库中的特定表,您可能还记得,Java 类可以包含对其他类的引用。这些关系也反映在数据库中。通常,它们要么是外键(对于 OneToOne、OneToMany、ManyToOne 关系),要么是中间表(对于 ManyToMany 关系)。当您的实体引用其他相关实体时,注释会放置在这些引用上方以指示关系类型:@OneToOne、@OneToMany、@ManyToOne、@ManyToMany。您可以在注释的级联属性中指定此关系的级联类型。JPA 有与实体交互的特定方法(持久、保存、合并...)。级联类型用于显示相关数据的行为方式;这些方法用于目标实体。那么级联策略(级联类型)有哪些呢?JPA 标准规定了六种级联类型的使用:-
PERSIST — 保存操作以级联方式发生(对于save()和persist()方法)。换句话说,如果我们保存与其他实体关联的实体,那么这些实体也会保存在数据库中(如果它们尚不存在)
-
MERGE — 更新操作以级联方式发生(对于merge()方法)
-
REMOVE — 删除操作以级联方式发生(remove()方法)
-
ALL — 同时包含三个级联操作 — PERSIST — MERGE — REMOVE
-
DETACH — 相关实体不由会话管理(detach()方法)。也就是说,当相关实体的数据发生更改时,数据库中的数据不会自动更新 - 它们从持久化转换为分离式(即实体不由 JPA 管理)
-
REFRESH — 每次使用数据库中的数据刷新实体(refresh() — 刷新分离的对象)时,其相关实体也会刷新。例如,您以某种方式更改了从数据库中获取的数据,并且您想要恢复原始值。在这种情况下,您会发现此操作很有用。

-
REPLICATE — 当我们有多个数据源并且希望数据同步时使用(Hibernate 的复制方法)。所有实体都必须有标识符(id),以确保可以毫无问题地创建(保证同一个实体对于不同的数据库不会有不同的id)
-
SAVE_UPDATE — 级联保存/删除(对于 Hibernate 的saveOrUpdate方法)
-
LOCK — 与DETACHED操作相反:将分离的实体转换回持久状态,即当前会话将再次跟踪该实体
54.实体类可以是抽象的吗?
根据JPA规范 的2.1实体类,“抽象类和具体类都可以是实体。 ”所以,答案是肯定的,抽象类可以是实体,并且可以用@Entity注解来标记。55.什么是实体管理者?它负责什么?
首先,我想指出EntityManager是JPA的重要组成部分。它用于实体与数据库的交互。一般来说,实体与数据库交互的方法是在实体上调用的(持久、合并、删除、分离)...但我也注意到,这个组件通常不是整个应用程序的单例。它通常是轻量级的,删除一个,然后使用EntityManagerFactory创建一个新的。如果我们与JDBC进行类比,其中EntityManagerFactory类似于DataSource,那么EntityManager类似于Connection。前面我提到持久实体是由当前连接管理的实体。该实体由EntityManager 和 TransactionManager管理,EntityManager 与当前连接密切相关,TransactionManager负责打开/关闭事务。在下图中,您可以看到实体的生命周期:
56.什么是Assert类?为什么使用它?
我在JPA中没有听说过这样的类,所以我假设这个问题是指在 JUnit 库中找到的用于单元测试的类。在这个库中,Assert类用于检查代码执行的结果(这里断言是指在代码中的特定位置具有特定状态/数据的断言)。例如,假设您正在测试一种应该创建一只猫的方法。运行该方法并得到一些结果:Cat resultOfTest = createCat();
但您需要确保它已正确创建,对吗?因此,您手动创建一个特定的猫(预期的猫),其参数与您希望在从createCat()方法获取的猫中看到的参数完全相同。然后使用Assert类来验证结果:
Assert.assertEquals(resultOfTest, expectedCat);
如果猫不同,则会抛出断言错误,这告诉我们没有得到预期的结果。Assert类有许多不同的方法,涵盖了有助于验证预期结果的各种操作。这里有几个:
-
assertTrue(<boolean>) — 作为参数传入的值预计为true
-
assertFalse(<boolean>) — 作为参数传入的值预计为false
-
assertNotEquals(<object1>, <object2>) — 使用 equals 进行比较时,作为参数传递的对象必须不同 ( false )
-
assertThrows(<ClassNameOfException>.class, <exceptionObject>) — 第二个参数应该是第一个参数抛出的异常(即第二个参数通常是应该抛出所需类型的异常的方法调用)
细绳
57.描述Java的String类
String是一个标准 Java 类,负责存储和操作字符串值(字符序列)。它是一个不可变类(我之前在这里 写过不可变类),即该类的对象的数据在创建后就不能更改。我想立即指出,StringBuilder和StringBuffer类本质上是相同的 - 唯一的区别是其中一个类用于多线程环境(StringBuffer)。这些类类似于String,但不同之处在于它们是可变的。即使在创建它们之后,它们也允许您修改它们表示的字符串,而无需创建新对象。他们的方法与标准String方法不同,是为字符串操作而设计的(他们称其为构建器是有原因的)。58.创建String对象有哪些方法?它是在哪里创建的?
创建字符串的最常见方法是在双引号中简单地指定我们想要的值:String str = "Hello World!";
您还可以使用new明确地执行此操作:
String str = new String("Hello World!");
您还可以从字符数组创建字符串:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
我们可以通过调用某个对象的 toString方法 来做到这一点:
String str = someObject.toString();
我们可以通过调用任何其他返回字符串的方法来做到这一点。例子:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
您知道可以有很多很多方法来创建字符串。当创建String对象时,它将存储在字符串池中,我们将在下面的问题之一中更详细地讨论该对象。
59. 如何比较两个 Java 字符串,以及如何对它们进行排序?
Java 使用双等号 ( == ) 来执行比较。如果我们需要比较像整数这样的简单值,我们会使用它。但这种方法不适合比较成熟的对象。它只会比较引用,即引用是否指向同一个对象。这意味着如果我们使用==比较具有相同字段值的两个对象,我们将得到false。这些字段具有相同的值,但对象本身在内存中占据不同的位置。 字符串对象尽管看似简单,但仍然是对象。使用==比较它们也是不合适的(尽管存在字符串池)。正确的解决方案是Object类的标准equals方法,需要重写该方法才能正常工作(默认情况下,它使用==进行比较)。String类重写了它,所以我们只使用它的实现:String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);

TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
控制台输出:
60.提供一种将字符串转换为字符的算法。编写相应的代码
正如我之前所说,String对象有许多不同的有用方法。其中之一是toCharArray。该方法将字符串转换为字符数组:String str = "Hello world";
char[] charArr = str.toCharArray();
接下来,我们有一个可以通过索引引用的字符数组:
char firstChar = charArr[0]; // H
61. 如何将字符串与字节数组相互转换?编写相应的代码
String类有一个getBytes方法,该方法与toCharArray方法类似,以字节数组形式返回字符串:String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
我们今天的审查得出了合乎逻辑的结论。谢谢阅读!
GO TO FULL VERSION