什么是持久性对象?

我正在阅读Java EE教程, 在这里我在开头看到这句话:

实体是轻量级持久性域对象。

我搜索了持久性对象但无法找到明确的解释。

什么是持久域对象

Java EE假设称为域模型 。 域模型由表示实体的对象组成,其中实体是具有与业务相关的身份的事物。 (例如,如果您在银行工作,您的域可能涉及账户,客户,控股和贷款等事项)。

以下是Bauer和King的Java Persistence with Hibernate引用域名模型的引用:

3.1.1。 分析业务领域

软件开发工作从问题域的分析开始(假设已经存在遗留代码或遗留数据库)。

在此阶段,您将在问题领域专家的帮助下识别与软件系统相关的主要实体。 实体通常是系统用户理解的概念:支付,客户,订单,项目,投标等。 一些实体可能是用户想到的不太具体的事物的抽象,例如定价算法,但即使这些实体通常也是可以理解的。 所有这些实体都可以在业务的概念视图中找到,我们有时将其称为业务模型。 面向对象软件的开发人员和架构师分析业务模型并创建面向对象的模型,仍处于概念层面(无Java代码)。 该模型可以像仅存在于开发人员头脑中的心理图像一样简单,也可以像由ArgoUML或TogetherJ等计算机辅助软件工程(CASE)工具创建的UML类图一样精细。 用UML表示的简单模型如图3.1所示。

此模型包含您必须在任何典型拍卖系统中找到的实体:类别,项目和用户。 实体及其关系(可能还有它们的属性)都由问题域的这个模型表示。 我们将这种面向对象的实体模型称为问题域,仅包含用户感兴趣的实体,即域模型。 这是对现实世界的抽象观点。

分析和设计领域模型背后的激励目标是为应用程序的目的捕获业务信息的本质。

理想情况下(在一种称为域驱动设计的方法中 )这些域对象具有两个特征:它们不了解持久性或事务等基础结构问题,并且它们包含实现在业务处理过程中操作时发生的状态转换的逻辑; 这些组合意味着业务逻辑可以与基础架构分开测试。 在现实世界中,更典型地看到不包含任何业务逻辑的贫血域对象 ,业务逻辑都以事务脚本结束。

无论如何,这个想法是你有一个由持久性实体组成的域模型。 存在某种配置(注释或XML文件或其他),它们将实体及其属性映射到数据库中的表和列,并映射实体之间的关系。 有一个Object-Relational Mapper(JPA是实现ORM的标准,Hibernate是一个这样的实现),它知道如何在数据库表示和对象图表示之间来回转换数据,以便开发人员可以操作对象而不是数据库行。

对于声称业务逻辑不应该是域模型的一部分的人,这里是另一篇来自Java Persistence with Hibernate的书,在3.1.2节中:

域模型中的实体应该封装状态和行为。 例如,用户实体应定义客户的名称和地址以及计算物料(对该特定客户)的运输成本所需的逻辑。 域模型是一个富对象模型,具有复杂的关联,交互和inheritance关系。 有关使用领域模型的面向对象技术的有趣而详细的讨论可以在企业应用程序架构模式(Fowler,2003)或领域驱动设计(Evans,2003)中找到。

在本书中,我们对业务规则或域模型的行为没有多少说法。 这不是因为我们认为它不重要; 相反,这种担忧主要与持久性问题正交。 这是我们实体的持久性状态,因此我们将讨论集中在如何在域模型中最好地表示状态,而不是如何表示行为。 例如,在本书中,我们对如何计算已售商品的税或系统如何批准新用户帐户不感兴趣。 我们更感兴趣的是如何表示用户与他们销售的商品之间的关系并使其持久。 每当我们仔细研究分层应用程序设计以及逻辑和数据访问的分离时,我们将在后面的章节中重新讨论这个问题。

显然,Hibernate开发人员认为它是一种可行的替代方案,尽管它似乎不是典型企业开发中的常用方法。

我只是添加了与Koray Tugay的另一个问题相关的答案。

在Java EE中,JPA实体通常是由JPA Container管理的Bean。 此容器在任何Java EE认证的应用程序服务器中提供。

每个实体Object都是RDBMS实例中一个或多个表的状态的内存中表示。 事务中managed实体的每个状态修改都将由容器自动处理,并映射为针对数据库执行的sql命令。 因此,您不必关心域模型的持久性部分。 只需修改相应的Java对象(实体)状态,它就会自动反映到数据库中。 (当然这不是魔法,而是有自己的陷阱。)

每个实体都是与为其提供连接池的datasource关联的persistence unit一部分。

持久性单元由许多EntityManager实例管理。 EntityManager负责管理相关persistence unit的所有实体的内存表示; 至少是当前从数据库加载的那些。 每个线程通常有一个EntityManager实例(〜每个http请求)。

当使用container-managed EntityManager (意味着注入@PersistenceContext )时,容器将自动传播持久性单元操作中隐含的所有bean(controller / services / dao / etc …)之间的事务上下文。

(最后一句意味着它会在遇到@transactionnal注释时打开一个事务,并且在当前方法调用期间执行的任何bean上的每个方法都将成为同一事务的一部分。事务将在结束时提交(或回滚)。方法执行)。

它是一个Domain对象的状态。

持久化实例在数据库中具有表示和标识符值。 它可能刚刚被保存或加载,但是,它定义在Session的范围内。

例如,在java ORM 框架hibernate中查看对象的状态

免责声明:这只是一个想法。