什么是持久性对象?

时间:2013-04-16 16:08:10

标签: java jpa

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

  

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

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

持久性域对象究竟是什么?

3 个答案:

答案 0 :(得分:9)

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

以下引用了Bauer和King的 Java Persistence with Hibernate 描述域模型:

  

3.1.1。分析业务领域

     

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

     

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

     

此模型包含您在任何典型情况下必须查找的实体   拍卖系统:类别,项目和用户。实体和他们的   关系(也许是他们的属性)都表示为   这个问题域的模型。我们称之为面向对象   来自问题域的实体模型,仅包含那些   用户感兴趣的实体,域模型。这是一个   现实世界的抽象视图。

     

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

理想情况下(在称为Domain-Driven Design的方法中)这些域对象具有2个特性:它们不知道持久性或事务等基础结构问题,并且它们包含实现状态转换的逻辑,这些状态转换是在它们被操作期间发生的。业务处理过程;这些组合意味着业务逻辑可以与基础架构分开测试。在现实世界中,看到anemic domain objects不包含任何业务逻辑更为典型,业务逻辑最终都在transaction scripts

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

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

  

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

     

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

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

答案 1 :(得分:2)

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

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

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

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

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

当使用container-managed EntityManager(表示注入了@PersistenceContext)时,容器会自动传播所有bean(controller / services / dao / etc ...)之间的事务上下文。持久性单元操作。

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

答案 2 :(得分:0)

它是域对象的状态。

  

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

例如,请参阅java ORM framework hibernate

中的对象状态

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