答案 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
中的对象状态免责声明:这只是一个想法。