提交 bdff4d08 编写于 作者: W wizardforcel

2020-06-04 11:39:34

上级 44785924
......@@ -2,15 +2,15 @@
> 原文: [https://howtodoinjava.com/hibernate/how-to-load-get-entity-in-hibernate/](https://howtodoinjava.com/hibernate/how-to-load-get-entity-in-hibernate/)
学习使用 session.load()或 session.get()方法通过 ID 来获取**Hiberate 实体。 了解 get 与 load 方法之间的区别,该方法通过 ID 从数据库中获取实体。**
学习使用`session.load()``session.get()`方法通过 ID 来获取 **Hiberate 实体**。 了解`get``load`方法之间的区别,该方法通过 ID 从数据库中获取实体。
## 1\. Hiberate 加载实体– session.load()
## 1\. Hiberate 加载实体 – `session.load()`
Hibernate 的`Session`接口提供了几种重载的`load()`方法,用于从数据库中加载实体。 每个`load()`方法都需要对象的**主键**作为标识符,并且必须提供该主键。
除了 ID,hibernate 还需要知道使用哪个类或实体名称来查找具有该 ID 的对象。 `load()`方法返回后,我们需要将返回的对象强制转换为合适的类类型,以进一步使用它。 我们需要`load()`方法来正常工作。
#### 1.1 会话 load()方法
#### 1.1 会话`load()`方法
让我们看看 Hiberate 会话界面中可用的`load()`方法的不同风格。
......@@ -31,7 +31,7 @@ public void load(Object object, Serializable id) throws HibernateException
当我们完成基本的 Hiberate 概念时,我们将讨论有关锁的更多信息。
#### 1.2 会话 load()方法示例
#### 1.2 会话`load()`方法示例
让我们以最简单的形式看一下每种加载方法的示例,以清楚地了解我们上面所读的内容。
......@@ -125,7 +125,7 @@ Lokesh - Gupta //Third load method
因此,我们能够从所有三种加载方法中成功加载实体。 现在转到`get()`方法。
## 2\. 通过 ID Hiberate 获取实体– session.get()
## 2\. Hiberate 通过 ID 获取实体 – `session.get()`
`get()`方法与`load()`方法非常相似。 `get()`方法采用标识符以及实体名称或类。 还有两种`get()`方法以锁定模式作为参数,但是稍后我们将讨论锁定模式。 其余`get()`方法如下:
......@@ -139,9 +139,9 @@ public Object get(String entityName, Serializable id) throws HibernateException
您可以修改上面的示例并测试代码。 如果您有任何问题,请告诉我。
## 3\. load()和 get()方法之间的区别
## 3\. `load()`和`get()`方法之间的区别
为什么我们有两种方法可以完成相同的工作。 实际上,这也是[采访问题](//howtodoinjava.com/java-interview-questions/ "Java Interview Questions")经常问到的问题。
为什么我们有两种方法可以完成相同的工作。 实际上,这也是[面试问题](//howtodoinjava.com/java-interview-questions/ "Java Interview Questions")经常问到的问题。
获取和加载方法之间的**区别在于,当标识符在数据库中不存在时,返回值将返回。**
......
......@@ -4,18 +4,18 @@
Hibernate 是 Java 语言的对象关系映射(ORM)库,它提供了将面向对象的域模型映射到传统关系数据库的框架。 这意味着不需要构建和执行与数据库交互的 SQL 查询。 您只需要通过调用 Hiberate API 来指示 Hiberate,Hiberate 将代表您创建并执行这些 SQL 查询。
在这个[Hiberate 教程](https://howtodoinjava.com/hibernate-tutorials/)中,我给出了在单个表中插入数据的示例。 我们在应用中有一个对象,即`Employee`。 我们想将其存储在数据库中。 `Employee`类具有以下属性:
在这个 [Hiberate 教程](https://howtodoinjava.com/hibernate-tutorials/)中,我给出了在单个表中插入数据的示例。 我们在应用中有一个对象,即`Employee`。 我们想将其存储在数据库中。 `Employee`类具有以下属性:
* 员工编号整数
* 电子邮件字符串
*字符串
*字符串
* 员工编号整数
* 电子邮件字符串
*字符串
*字符串
它可以有更多的字段,但是我仅用四个来举例说明。
## 1\. Hiberate 实体类
Hiberate 与标记为 Hiberate 实体的 Java POJO 类进行对话。 要将 Java 类转换为实体,我们需要在其上应用 **@Entity** 注解。 还有其他**Hiberate 注释**,例如 **@Table****@Column****@Id** 等,它们有助于将实体字段映射到数据库表和列 。
Hiberate 与标记为 Hiberate 实体的 Java POJO 类进行对话。 要将 Java 类转换为实体,我们需要在其上应用`@Entity`注解。 还有其他 **Hiberate 注释**,例如`@Table``@Column``@Id`等,它们有助于将实体字段映射到数据库表和列 。
应用注释后,`Employee`实体类如下所示。
......@@ -49,7 +49,7 @@ public class EmployeeEntity implements Serializable
## 2\. Hiberate 配置
下一步是在“ **hibernate.cgf.xml** ”文件中配置 Hiberate。 该文件包含系统和数据库连接元数据中的所有可用实体。
下一步是在“`hibernate.cgf.xml`”文件中配置 Hiberate。 该文件包含系统和数据库连接元数据中的所有可用实体。
```java
<?xml version="1.0" encoding="utf-8"?>
......@@ -71,9 +71,9 @@ public class EmployeeEntity implements Serializable
```
## 3\. Hibernate SessionFactory
## 3\. Hibernate `SessionFactory`
现在,Hiberate 配置已经就绪,我们必须构建**Hiberate 会话工厂**。 会话工厂用于获取数据库以及各种活动(如提交和回滚)的连接。
现在,Hiberate 配置已经就绪,我们必须构建 **Hiberate 会话工厂**。 会话工厂用于获取数据库以及各种活动(如提交和回滚)的连接。
```java
public class HibernateUtil
......@@ -146,7 +146,7 @@ Hibernate: insert into EMPLOYEE (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)
![Hibernate insert query example](img/99cb8ebbbeab768d40befa1404506727.png)
Hibernate insert query example
Hibernate 插入查询示例
......
......@@ -2,13 +2,13 @@
> 原文: [https://howtodoinjava.com/hibernate/merging-and-refreshing-hibernate-entities/](https://howtodoinjava.com/hibernate/merging-and-refreshing-hibernate-entities/)
在先前的教程中,我们了解了在 Hiberate 中使用`save()``saveOrUpdate()`方法保存 [**实体的知识。 从中我们了解到,在大多数情况下,您甚至都不需要那些方法,因为 hibernate 自动管理**](//howtodoinjava.com/hibernate/save-and-saveorupdate-for-saving-hibernate-entities/ "Save() and saveOrUpdate() for Saving Hibernate Entities") **[**持久实体**](//howtodoinjava.com/hibernate/hibernate-entity-persistence-lifecycle-states/ "Hibernate Entity / Persistence LifeCycle States") 上的更新。 在大多数情况下,您只需要关心瞬态对象。 在本教程中,我将讨论有关 Hiberate 会话类中存在的`refresh()`和`merge()`方法的一些想法。**
在先前的教程中,我们了解了在 Hiberate 中使用`save()``saveOrUpdate()`方法[**保存实体**](//howtodoinjava.com/hibernate/save-and-saveorupdate-for-saving-hibernate-entities/ "Save() and saveOrUpdate() for Saving Hibernate Entities")的知识。 从中我们了解到,在大多数情况下,您甚至都不需要那些方法,因为 hibernate 自动管理[**持久化实体**](//howtodoinjava.com/hibernate/hibernate-entity-persistence-lifecycle-states/ "Hibernate Entity / Persistence LifeCycle States")上的更新。 在大多数情况下,您只需要关心瞬态对象。 在本教程中,我将讨论有关 Hiberate 会话类中存在的`refresh()``merge()`方法的一些想法。
## 使用 refresh()方法刷新 Hiberate 实体
## 使用`refresh()`方法刷新 Hiberate 实体
有时,我们会遇到这样的情况:我们的应用数据库被某些外部应用/代理修改,因此您的应用中的相应 Hiberate 实体实际上与其数据库表示不同步,即具有旧数据。 在这种情况下,可以使用 **`session.refresh()`方法用数据库**中可用的最新数据重新填充实体。
有时,我们会遇到这样的情况:我们的应用数据库被某些外部应用/代理修改,因此您的应用中的相应 Hiberate 实体实际上与其数据库表示不同步,即具有旧数据。 在这种情况下,可以使用`session.refresh()`方法用数据库中可用的最新数据重新填充实体。
您可以在 Session 接口上使用 refresh()方法之一来刷新持久对象的实例,如下所示:
您可以在`Session`接口上使用`refresh()`方法之一来刷新持久对象的实例,如下所示:
```java
public void refresh(Object object) throws HibernateException
......@@ -18,7 +18,7 @@ public void refresh(Object object, LockMode lockMode) throws HibernateException
这些方法将从数据库重新加载对象的属性,并覆盖它们。 在现实生活中的应用中,除了上述情况之外,您不必经常使用`refresh()`方法。
我们来看一个 refresh()方法的示例。
我们来看一个`refresh()`方法的示例。
```java
public class RefreshEntityExample
......@@ -77,14 +77,14 @@ true
查看突出显示的线条上方。
* 第 15 行以“ Lokesh”的名字保存员工
* 第 26 行设置了名字“ Vikas”。 由于实体已分离,因此不会更新数据库。
* 第 15 行以“`Lokesh`”的名字保存员工
* 第 26 行设置了名字“`Vikas`”。 由于实体已分离,因此不会更新数据库。
* 第 27 行使用`refresh()`方法用数据库刷新实体。
* 第 32 行验证在实体中设置的名字是否已用“ Lokesh”更新,因为这是数据库当前所拥有的名字。
* 第 32 行验证在实体中设置的名字是否已用“`Lokesh`”更新,因为这是数据库当前所拥有的名字。
这全部与刷新方法有关。 让我们看另一种类似的方法`merge()`
## 使用 merge()方法合并 Hiberate 实体
## 使用`merge()`方法合并 Hiberate 实体
方法`merge()``refresh()`的作用完全相反,即,它使用来自分离实体的值更新数据库。 刷新方法是使用最新的数据库信息更新实体。 所以基本上,两者是完全相反的。
......@@ -98,7 +98,7 @@ Object merge(String entityName, Object object)
Hibernate 官方文档对`merge()`方法给出了很好的解释:
Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session. This operation cascades to associated instances if the association is mapped with cascade=”merge”.
将给定对象的状态复制到具有相同标识符的持久对象上。 如果当前没有与该会话关联的持久性实例,则将其加载。 返回持久实例。 如果给定实例未保存,请保存的副本并将其作为新的持久实例返回。 给定的实例不与会话关联。 如果关联是用`cascade="merge"`映射的,则此操作将级联到关联的实例。
因此,如果我以下面的代码为例,那么下面列出的几点对您来说应该很清楚。
......@@ -107,12 +107,12 @@ EmployeeEntity mergedEmpEntity = session.merge(empEntity);
```
*“ empEntity”传递给 merge()方法时,它是分离的实体。
* merge()方法将使用从 empEntity 获取的标识符信息搜索已加载的 EmployeeEntity 实例。 如果找到了这样的持久性实体,那么它将用于更新。 否则,将使用“ empEntity”中存在的相同标识符信息将新的 EmployeeEntity 加载到会话中。
* 数据从“ empEntity”复制到新发现/加载的实体。
* 由于新实体/发现实体是永久性的,因此从“ empEntity”复制到该实体的所有数据都会自动保存到数据库中。
* merge()方法返回对该新实体的引用,并将其分配给“ mergedEmpEntity”变量。
* “ empEntity”仍然是独立实体。
*`empEntity`传递给`merge()`方法时,它是分离的实体。
* `merge()`方法将使用从`empEntity`获取的标识符信息搜索已加载的`EmployeeEntity`实例。 如果找到了这样的持久性实体,那么它将用于更新。 否则,将使用`empEntity`中存在的相同标识符信息将新的`EmployeeEntity`加载到会话中。
* 数据从`empEntity`复制到新发现/加载的实体。
* 由于新实体/发现实体是永久性的,因此从`empEntity`复制到该实体的所有数据都会自动保存到数据库中。
*`merge()`方法返回对该新实体的引用,并将其分配给`mergedEmpEntity`变量。
* `empEntity`仍然是独立实体。
```java
public class MergeEntityExample
......@@ -172,8 +172,8 @@ true
```
在上面的示例中,“ mergedPersistentEmpEntity”是具有持久性的新实体。 因此,如果您想进行其他更改,请输入“ mergedPersistentEmpEntity”实例。
在上面的示例中,`mergedPersistentEmpEntity`是具有持久性的新实体。 因此,如果您想进行其他更改,请输入`mergedPersistentEmpEntity`实例。
本教程涵盖了 Hiberate 中的 **`merge()`和`refresh()`方法。 请记住,可以问以下问题:`merge()`和`refresh()`** 之间的**差异,或`merge()`和`load()`** 之间的**差异等。准备好遇到[ [**面试问题**](//howtodoinjava.com/java-interview-questions/ "Java Interview Questions") 。**
本教程涵盖了 Hiberate 中的`merge()``refresh()`方法。 请记住,可以问以下问题:`merge()``refresh()`之间的差异,或`merge()``load()`之间的差异等。准备好在[**面试问题**](//howtodoinjava.com/java-interview-questions/ "Java Interview Questions")中遇到这些差异。
**祝您学习愉快!**
\ No newline at end of file
# Hibernate 4 –获取延迟加载的实体参考
# Hibernate 4 – 获取延迟加载的实体参考
> 原文: [https://howtodoinjava.com/hibernate/hibernate-4-example-to-get-entity-reference-for-lazy-loading/](https://howtodoinjava.com/hibernate/hibernate-4-example-to-get-entity-reference-for-lazy-loading/)
根据 Wikipedia 的定义, [**延迟加载**](https://en.wikipedia.org/wiki/Lazy_loading "lazy loading") 是一种设计模式,通常用于计算机编程中,以将对象的初始化推迟到需要的时间点。 我们知道,在 Hiberate 映射中,可以通过在 Hiberate 映射注释中指定**“ fetch = FetchType.LAZY”** 来完成延迟加载。 例如
根据 Wikipedia 的定义, [**延迟加载**](https://en.wikipedia.org/wiki/Lazy_loading "lazy loading")是一种设计模式,通常用于计算机编程中,以将对象的初始化推迟到需要的时间点。 我们知道,在 Hiberate 映射中,可以通过在 Hiberate 映射注释中指定`fetch = FetchType.LAZY`来完成延迟加载。 例如:
```java
@ManyToOne ( fetch = FetchType.LAZY )
......@@ -16,11 +16,11 @@ public EmployeeEntity getEmployee() {
```
关键是仅在定义两个实体之间的映射时才应用**。 如果已经在 DepartmentEntity 中定义了以上实体,则如果您获取 DepartmentEntity,则 EmployeeEntity 将被延迟加载。**
关键是仅在定义两个实体之间的映射时才应用它。 如果已经在`DepartmentEntity`中定义了以上实体,则如果您获取`DepartmentEntity`,则`EmployeeEntity`将被延迟加载。
但是,如果您要延迟加载 DepartmentEntity 本身,即**主实体本身应延迟加载**,该怎么办。
但是,如果您要延迟加载`DepartmentEntity`本身,即**主实体本身应延迟加载**,该怎么办。
可以通过在 **IdentifierLoadAccess** 类中使用 [**getReference()**](http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/IdentifierLoadAccess.html#getReference%28java.io.Serializable%29 "IdentifierLoadAccess") 方法解决此问题。
可以通过在`IdentifierLoadAccess`类中使用[**`getReference()`**](http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/IdentifierLoadAccess.html#getReference%28java.io.Serializable%29 "IdentifierLoadAccess")方法解决此问题。
让我们通过此示例了解用法。
......@@ -35,9 +35,9 @@ public EmployeeEntity getEmployee() {
```
现在,我有一个主实体类 EmployeeEntity,它可以具有多个属性以及与其他实体的映射。
现在,我有一个主实体类`EmployeeEntity`,它可以具有多个属性以及与其他实体的映射。
**EmployeeEntity.java**
**`EmployeeEntity.java`**
```java
@Entity
......@@ -73,7 +73,7 @@ public class EmployeeEntity implements Serializable {
让我们在代码示例中这样做:
**TestHibernate.java**
**`TestHibernate.java`**
```java
public class TestHibernate
......@@ -127,8 +127,4 @@ user
要下载以上教程的源代码,请单击下面的下载链接。
```java
**源码下载**
```
**祝您学习愉快!**
\ No newline at end of file
......@@ -2,15 +2,15 @@
> 原文: [https://howtodoinjava.com/hibernate/hibernate-example-of-insertselect-blob-from-database/](https://howtodoinjava.com/hibernate/hibernate-example-of-insertselect-blob-from-database/)
在先前的 **[Hiberate 教程](//howtodoinjava.com/hibernate-tutorials/ "hibernate tutorials")** 中,我们了解了 [**一级缓存**](//howtodoinjava.com/hibernate/understanding-hibernate-first-level-cache-with-example/ "first level cache")[**二级缓存** [](//howtodoinjava.com/hibernate/how-hibernate-second-level-cache-works/) 和一些 [**映射示例**](//howtodoinjava.com/hibernate/hibernate-one-to-one-mapping-using-annotations/) 等。这是 [**Hiberate 相关教程**](//howtodoinjava.com/category/frameworks/hibernate/) 的完整列表。 在本文中,我将举一个使用 hibernate 将 BLOB 数据插入数据库并使用 hibernate 实体从数据库中获取数据的示例。
在先前的 [**Hiberate 教程**](//howtodoinjava.com/hibernate-tutorials/ "hibernate tutorials")中,我们了解了[**一级缓存**](//howtodoinjava.com/hibernate/understanding-hibernate-first-level-cache-with-example/ "first level cache")[**二级缓存**](//howtodoinjava.com/hibernate/how-hibernate-second-level-cache-works/)和一些[**映射示例**](//howtodoinjava.com/hibernate/hibernate-one-to-one-mapping-using-annotations/)等。这是 [**Hiberate 相关教程**](//howtodoinjava.com/category/frameworks/hibernate/)的完整列表。 在本文中,我将举一个使用 hibernate 将 BLOB 数据插入数据库并使用 hibernate 实体从数据库中获取数据的示例。
In short, inserting and fetching BLOB data such as images requires two steps: define database column type as “BLOB” and have a field in entity of type “byte array”.
简而言之,插入和获取 BLOB 数据(例如图像)需要两个步骤:将数据库列类型定义为“BLOB”,并且在实体中具有“字节数组”类型的字段。
让我们举个例子,其中,我将 Windows C 驱动器中的“ test.png”图像插入数据库(MySQL)。 然后,我将再次从数据库中读取图像数据并将其存储到其他位置。
让我们举个例子,其中,我将 Windows C 驱动器中的“`test.png`”图像插入数据库(MySQL)。 然后,我将再次从数据库中读取图像数据并将其存储到其他位置。
## Hiberate 实体
请注意,我已将数据字段声明为 byte []
请注意,我已将数据字段声明为`byte[]`
```java
@Entity
......@@ -69,7 +69,7 @@ public class ImageWrapper implements Serializable {
![Hibernate blob example](img/7cdb4a2ecbfdadca72f1ca73ccb8c329.png "Hibernate blob example")
Hibernate blob example
Hibernate blob 示例
......@@ -101,7 +101,7 @@ Hibernate blob example
作为参考,这是我在此示例中使用的配置:
**hibernate.cfg.xml**
**`hibernate.cfg.xml`**
```java
<?xml version="1.0" encoding="utf-8"?>
......@@ -123,9 +123,9 @@ Hibernate blob example
```
以下也是 HibernateUtil.java 的代码
以下也是`HibernateUtil.java`的代码
**HibernateUtil.java**
**`HibernateUtil.java`**
```java
public class HibernateUtil {
......@@ -160,6 +160,6 @@ public class HibernateUtil {
如果仍然感到麻烦,请下载随附的源代码。
**[源码下载](https://docs.google.com/file/d/0B7yo2HclmjI4R0dDNzY5OTR6ZG8/edit?usp=sharing "hibernate blob example")**
[**源码下载**](https://docs.google.com/file/d/0B7yo2HclmjI4R0dDNzY5OTR6ZG8/edit?usp=sharing "hibernate blob example")
**祝您学习愉快!**
\ No newline at end of file
......@@ -69,7 +69,7 @@ Hibernate 可以在实体和关联上应用延迟加载行为的最简单方法
解决方法是确保通过将实体附加到会话来使该实体再次成为持久性,或者确保在将实体从会话中分离之前,将访问所有需要的字段(将它们加载到实体中)。
这就是这个简单但非常重要的概念,即**如何在 Hiberate**中加载懒对象。 对于**Hiberate 获取策略[采访问题](https://howtodoinjava.com/java-interview-questions/)** 的初学者来说,这可能是一个问题。
这就是这个简单但非常重要的概念,即**如何在 Hiberate**中加载懒对象。 对于**Hiberate 获取策略[面试问题](https://howtodoinjava.com/java-interview-questions/)** 的初学者来说,这可能是一个问题。
如果不清楚或您想讨论任何事情,请发表评论。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册