我正在阅读 Java EE 教程,在这里我在开头看到了这句话:
实体是一个轻量级的持久域对象。
我搜索了持久性对象,但找不到明确的解释。
持久域对象到底是什么 ?
Java EE 假设有一个称为域模型的东西。域模型由表示实体的对象组成,其中实体是具有与业务相关的身份的东西。(例如,如果您在银行工作,您的域可能涉及账户、客户、控股和贷款等内容)。
这是 Bauer 和 King 的Java Persistence with Hibernate 中描述域模型的引述:
3.1.1。分析业务领域
软件开发工作始于对问题域的分析(假设不存在遗留代码或遗留数据库)。
在这个阶段,您在问题领域专家的帮助下,确定与软件系统相关的主要实体。实体通常是系统用户理解的概念:支付、客户、订单、项目、投标等。一些实体可能是用户考虑的不太具体的事物的抽象,例如定价算法,但即使这些实体通常对用户来说也是可以理解的。所有这些实体都可以在业务的概念视图中找到,我们有时将其称为业务模型。面向对象软件的开发人员和架构师分析业务模型并创建面向对象的模型,但仍处于概念级别(无 Java 代码)。这个模型可能就像只存在于开发者脑海中的心理图像一样简单,或者它可能像 ArgoUML 或 TogetherJ 等计算机辅助软件工程 (CASE) 工具创建的 UML 类图一样精细。图 3.1 显示了一个用 UML 表示的简单模型。
此模型包含您在任何典型拍卖系统中必然会找到的实体:类别、项目和用户。实体及其关系(可能还有它们的属性)都由这个问题域模型表示。我们称这种来自问题域的面向对象的实体模型(仅包含用户感兴趣的实体)称为域模型。这是对现实世界的抽象视图。
分析和设计领域模型背后的动机是为了应用程序的目的捕获业务信息的本质。
理想情况下(在一种称为域驱动设计的方法中)这些域对象具有 2 个特性:它们不了解诸如持久性或事务之类的基础架构问题,并且它们包含实现在业务处理过程中对其进行操作时发生的状态转换的逻辑; 这些组合意味着业务逻辑可以独立于基础设施进行测试。在现实世界中,更常见的是不包含任何业务逻辑的贫血领域对象,业务逻辑都以事务脚本结束。
无论如何,这个想法是你有一个由持久实体组成的域模型。有某种配置(注释或 XML 文件或其他)将实体及其属性映射到数据库中的表和列,并映射实体之间的关系。有一个 Object-Relational Mapper(JPA 是实现 ORM 的标准,Hibernate 就是这样一种实现)知道如何在数据库表示和对象图表示之间来回转换数据,以便开发人员可以操作对象而不是数据库行数。
对于那些声称业务逻辑不应该成为领域模型一部分的人,这里引用了Java Persistence with Hibernate一书的第 3.1.2 节:
领域模型中的实体应该封装状态和行为。例如,用户实体应定义客户的姓名和地址,以及计算项目(到该特定客户)的运输成本所需的逻辑。领域模型是一个富对象模型,具有复杂的关联、交互和继承关系。可以在企业应用程序架构模式(Fowler,2003)或领域驱动设计(Evans,2003)中找到有关使用领域模型的面向对象技术的有趣且详细的讨论。
在本书中,我们不会过多谈论业务规则或领域模型的行为。这不是因为我们认为它不重要;相反,这种担忧大多与持久性问题正交。实体的状态是持久的,因此我们集中讨论如何在我们的领域模型中最好地表示状态,而不是如何表示行为。例如,在本书中,我们对如何计算已售商品的税款或系统如何批准新用户帐户不感兴趣。我们更感兴趣的是用户和他们销售的商品之间的关系是如何被表示和持久化的。每当我们仔细研究分层应用程序设计以及逻辑和数据访问的分离时,我们将在后面的章节中重新讨论这个问题。
显然,Hibernate 开发人员认为它是一种可行的替代方案,尽管它似乎不是典型企业开发中的常用方法。
我只是添加了与Koray Tugay 的另一个问题相关的答案。
在 Java EE 中,JPA 实体通常是由 JPA 容器管理的 Bean。此容器在任何经过 Java EE 认证的应用程序服务器中都提供。
每个实体对象都是 RDBMS 实例中一个或多个表的状态的内存表示。事务中实体的每个状态修改managed
都将由容器自动处理,并映射为对数据库执行的 sql 顺序。因此,您不必关心域模型的持久性部分。只需修改对应的Java对象(实体)状态,就会自动反映到数据库中。
(当然,这不是魔术,它有自己的陷阱。)
每个实体都是persistence unit
关联到 a的一部分,datasource
为其提供了连接池。
一个持久性单元由许多EntityManager
实例管理。EntityManager
负责管理关联的所有实体的内存表示persistence unit
;至少是当前从数据库中加载的那些。通常EntityManager
每个线程都有一个实例(〜每个http请求)。
当使用container-managed EntityManager
(意味着注入@PersistenceContext
)时,容器将自动为您传播持久性单元操作中隐含的所有 bean(控制器/服务/dao/等)之间的事务上下文。
(最后一句的意思是当遇到@transactionnal
注解时它会打开一个事务,并且在当前方法调用期间执行的任何 bean 上的每个方法都将是同一个事务的一部分。事务将在方法执行结束时提交(或回滚) )。
它是域对象的状态。
持久实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载,但是,根据定义,它在 Session 的范围内。
例如在 java ORM framework hibernate中查看对象的状态
免责声明:这只是一个想法。