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

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

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

什么是持久域对象

===============>>#1 票数:9 已采纳

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

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

3.1.1。 分析业务领域

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

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

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

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

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

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

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

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

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

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

===============>>#2 票数:2

我只是添加了与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上的每个方法都将成为同一事务的一部分。事务将在结束时提交(或回滚)。方法执行)。

===============>>#3 票数:0

它是一个Domain对象的状态。

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

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

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

  ask by Koray Tugay translate from so

未解决问题?本站智能推荐:

2回复

JPA持久化对象而不调用持久性

我有一个实体类Document,另一个是Space。 关系: 好吧,我确实查询数据库并将一些文档带入LinkedList。 此列表绑定到dataTable,从那里我可以执行一些更新操作,例如: 和方法: 我不明白为什么在设置文档实体的toSpace时, 也实际上没
4回复

持久性对象无法从persistence.xml中找到持久性单元

环境:Windows 7,NetBean 6.9(包括GlassFish v3,Java EE 6),MySQL服务器 我已经在MySQL数据库中创建了表,并通过右键单击项目并选择“ create entity from database ”来使用NetBean的功能(对不起,如果措辞错误
8回复

什么是持久性语境?

我是Java世界和JPA的新手。 我正在学习JPA,并遇到了许多新的术语,如实体,持久性。 在阅读时,我无法理解持久化上下文的确切定义。 任何人都可以用简单的外行语言来解释它吗? 它与@Entity使用的数据有什么关系? 例如,我发现这个定义太复杂,无法理解: 持久化
1回复

没有持久性提供者

我试图在Wildfly上运行一个非常基本的JPA示例。 这是我的项目的结构: Person和Project是两个JPA实体。 这是我的persistence.xml的内容 表是从实体类正确生成的,因此我知道persistence.xml是有效的。 我正在尝试在Cre
1回复

持久性JPA

我有一个实体课 公共Candidatos(){} } 和我的JPA控制器 公共类CandidatosJpaController实现了Serializable { } 但是当我实例课时 说我,类CandidatosJpaController中的构造函
1回复

JPA持久性和Hibernate javassist对象

我正在使用Play Framework v.1.2.6进行项目,当我尝试从数据库中检索它时,我遇到了对象休眠的问题。 https://www.playframework.com/documentation/1.2.x/jpa 我有一个查询从mysql表中选择行,结果中有代理对象。 请看
1回复

没有数据库映射的对象持久性

我正在寻找关于持久化Java对象而不需要数据库映射的建议。 简而言之,我想拥有JPA,但又不想被数据库结构的细节所困扰:表,列,键。 理想情况下,我想要实现的只是定义Java类,实例化对象并持久化/检索这些对象及其关联,而无需在其他任何地方重复实体/属性信息。 我知道有各种各样的NOSQL
1回复

如何使用持久性克隆jpa对象

嗨,大家好,我在下面使用了以下代码 我有个疑问 EntityManager.detach() 这会删除id和持久性吗? 所以我一直在尝试这段代码来获得结果,但是所有数据都丢失了。 需求 需要克隆jpa对象
1回复

DDD何时应该创建域对象和持久性对象而不是使用持久性对象作为域对象?

当我对领域驱动设计的理解工作时,我发现我有一个似乎有效的规则,虽然我想看看它是否过度,并且还希望看到相同情况的其他观点。 我的问题是:“域模型和持久性模型应该何时包含在单独的对象中?” 我现在选择的语言是Java,我正在使用Spring Data的存储库模型。 我看到了我的问题的三
1回复

Eclipselink:将对象写入持久性数据库/从持久性数据库检索对象时出错

我最近切换了开发机器,现在将对象写入持久性数据库/从持久性数据库检索对象不再起作用。 当我尝试在新机器上调试webapp项目时,会发生这种情况。 它可以在我的旧笔记本电脑上使用,但不知如何在新笔记本电脑上使用。 我还将webapp部署到服务器上,一切正常。 与数据库交互时收到以下两个