【问题标题】:What is a persistence object?什么是持久对象?
【发布时间】:2013-04-09 03:28:08
【问题描述】:

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

实体是一个轻量级的持久域对象。

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

究竟什么是持久性域对象

【问题讨论】:

  • 轻量级意味着它在 JEE (JPA) 容器之外可用。意味着您可以将它与任何 J2se 应用程序(tomcat、spring 或独立的 java 应用程序等)一起使用。这是因为底层实现通常由独立的 ORM 框架(如 hibernate)提供。在这种情况下,您将使用application managed EntityManager,并且无法利用事务上下文传播。 (除了使用弹簧起到jee容器的作用)

标签: java jpa


【解决方案1】:

Java EE 假定称为Domain Model。域模型由表示实体的对象组成,其中Entity 是具有与业务相关的身份的东西。 (例如,如果您在一家银行工作,您的域可能涉及账户、客户、控股和贷款等内容)。

这是 Bauer 和 King 的 Java Persistence with Hibernate 中描述域模型的引述:

3.1.1。分析业务领域

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

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

此模型包含您在任何典型的 拍卖系统:类别、项目和用户。实体及其 关系(也许还有它们的属性)都由 这个问题域的模型。我们称这种面向对象 来自问题域的实体模型,仅包含那些 用户感兴趣的实体,域模型。这是一个 现实世界的抽象视图。

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

理想情况下(在一种称为Domain-Driven Design 的方法中),这些域对象具有两个特性:它们不知道诸如持久性或事务之类的基础架构问题,并且它们包含实现状态转换的逻辑,这些逻辑在它们在处理过程中被操作时发生。业务处理;这些组合意味着业务逻辑可以独立于基础设施进行测试。在现实世界中更典型的是看到anemic domain objects不包含任何业务逻辑,业务逻辑都以transaction scripts结尾。

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

对于那些声称业务逻辑不应该成为域模型的一部分的人,这里是 Java Persistence with Hibernate 一书中第 3.1.2 节中的另一句话:

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

在本书中,我们不会对业务规则或关于 我们的领域模型的行为。这不是因为我们认为 不重要;相反,这种担忧大多与问题正交 的坚持。我们实体的状态是持久的,所以 我们集中讨论如何在我们的 领域模型,而不是关于如何表示行为。例如,在这个 书,我们对如何计算已售商品的税款不感兴趣,或者 系统如何批准新用户帐户。我们更感兴趣 用户与他们销售的商品之间的关系如何 代表并坚持下去。我们稍后会重新讨论这个问题 章节,每当我们仔细研究分层应用程序设计时 以及逻辑和数据访问的分离。

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

【讨论】:

  • 我明白这个答案在 4 年后的价值。谢谢,很好的答案!
【解决方案2】:

我只是添加了与another question of Koray Tugay相关的这个答案。

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

    它是域对象的状态。

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

    例如在 java ORM framework hibernate 中查看对象的状态

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

    【讨论】:

    • 如果这是引用,请在您找到它的原始位置发布。
    • 它就像一个java类,具有特定的域信息。例如User是一个域对象,它包含与用户相关的信息
    • @KorayTugay 似乎您正在以自己的方式学习所有内容。虽然这很好(我鼓励这样做),但您需要了解一些概念是基于业务或高级概念而不是技术,如我在对您的问题的评论中发布的第一个链接所示。跨度>
    • @NoobUnChained 你错了,你在控制器/业务逻辑类/组件中编写业务逻辑,例如 EJB 或 Spring @Component(只是为了展示一些示例)。另一方面,域对象用于表示应用程序中的实体。
    • @Luiggi:您对 NoobUnChained 的评论描述了典型的做法,但声称没有业务逻辑可以进入该领域是夸大其词。请参阅我在此处添加到我的答案中的引号以获得不同的视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2011-08-11
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多