2013-04-16 162 views
2

我读了Java EE教程和here我看到这句话在开始时:什么是持久对象?

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

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

究竟是一个持久域对象

+0

相关:[业务对象](http://en.wikipedia.org/wiki/Business_object)在技术上称为[域对象](http://stackoverflow.com/q/10394667/1065197)和[持久性域对象](http://stackoverflow.com/q/9735914/1065197)。 –

+0

轻量级意味着它在JEE(JPA)容器外部可用。意味着您可以将它与任何J2​​se应用程序(tomcat,spring或独立的java应用程序等)一起使用。这是因为底层实现通常由像hibernate这样的独立ORM框架提供。在这种情况下,您将使用“应用程序管理的EntityManager”,并且无法利用事务性上下文传播。 (除了使用发挥jee容器作用的弹簧时) – Gab

回答

7

Java EE假设了一个叫做Domain Model的东西。领域模型由表示实体的对象组成,其中Entity是具有与业务相关的身份的事物。 (例如,如果您在银行工作,则您的域名可能涉及帐户,客户,控股和贷款等业务)。

这里是鲍尔和国王Java持久性报价与Hibernate描述域模型:

3.1.1。分析业务域

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

在此阶段,您在问题领域专家的帮助下确定与软件系统相关的主要实体 。实体 通常是系统用户理解的概念:付款, 客户,订单,项目,出价等。一些实体可能是 抽象用户认为较不具体的东西,如 定价算法,但即使这些通常是 用户可以理解。所有这些实体都在 业务的概念视图中找到,我们有时称之为业务模型。开发人员和面向对象软件架构师分析业务模型,并创建一个面向对象的模型,仍然在概念层面(没有 Java代码)。这种模式可能与开发人员心目中仅存在的心理图像一样简单,或者可能与由诸如ArgoUML或TogetherJ的计算机辅助软件工程(CASE) 工具创建的UML 类图一样精细。以UML表示的简单模型是图3.1所示的 。

此模型包含您必须在任何典型的 拍卖系统中找到的实体:类别,项目和用户。这些实体和它们的关系(以及它们的属性)全部由 这个问题域的模型表示。我们称这种面向对象为 模型的实体来自问题域,只包含那些对用户感兴趣的实体,一个域模型。这是一个真实世界的抽象视图 。

分析和设计域模型 背后的动机目标是捕获应用程序目的的商业信息的本质。

理想的情况下(在方法称为Domain-Driven Design)这些领域对象有2个特点:他们不知道有关的基础设施的担忧像持久性或事务,以及它们所包含的逻辑实现,当他们在过程中被操纵发生的状态转换业务处理;这些组合意味着业务逻辑可以与基础架构分开进行测试。在现实世界中,更典型的是看到anemic domain objects不包含任何业务逻辑,业务逻辑全部以transaction scripts结束。

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

对于谁声称,业务逻辑不应该是域模型的一部分人来说,这里是从Java持久性的另一个报价与Hibernate书,第3.1.2节:

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

在这本书中,我们不会多说关于业务规则或关于我们领域模型的行为。这不是因为我们认为它不重要,而是 ;相反,这种担心主要与持久性问题 正交。这是我们实体的状态是持久的,所以我们集中讨论如何在我们的 域模型中最好地表示状态,而不是如何表示行为。例如,在这本 书中,我们对如何计算出售物品的税金没有兴趣,或者 系统如何批准新的用户帐户。我们更感兴趣的是 ,用户和他们出售的物品之间的关系是如何表示并持续存在的,如 。我们将在稍后的 章节中重新讨论这个问题,只要我们仔细看看分层应用程序设计 以及逻辑和数据访问的分离。

因此很明显,Hibernate的开发者认为这是一个可行的选择,尽管它似乎并没有在典型的企业发展的常用方法。

+0

我了解4年后这个答案的价值。谢谢,很好的回答! –

0

它是一个Domain对象的状态。

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

例如在这里看到的物体的状态在Java ORM framework hibernate

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

+3

如果这是一个报价,请张贴您找到它的原始位置。 –

+1

什么是域对象? –

+0

@LuiggiMendoza查看框架休眠链接 –

2

我只是补充说这个答案与another question of Koray Tugay有关。

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

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

每个实体相关联提供了连接池的其中一个datasourcepersistence unit一部分。

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

当使用container-managed EntityManager(与@PersistenceContext注入方式),容器将自动传播给你持久化单元操作所蕴含的所有的bean(控制器/服务/刀/等)之间的交易环境。

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