我正在尝试设计一个非常简单的应用程序,并让自己对Hibernate对实体和值对象的定义感到困惑(如Java Persistence with Hibernate的第4章中所定义).
我所拥有的是一个与客户合作的应用程序,可以下订单(一对多关系).这些订单中的每一个都有许多订单行(也是一对多).现在,我认为客户有身份(客户编号),订单(订单编号)也是如此,因此他们是实体对象?我的困惑在于订单行.
订单行包含数量,产品编号和价格.如果订单行没有它的顺序就不能存在,并且它没有自己的标识,因此我将其视为一个值对象.但我不能将订单行作为订单表的一部分,因为订单与订单行之间存在一对多的关系.一对多关系如何与值对象的定义一起使用?来自Hibernate的书:
"值类型的对象没有数据库标识;它属于实体实例,其持久状态嵌入在拥有实体的表行中.值类型没有标识符或标识符属性"
如果有人能解决我的困惑,我会非常感激:)
在值对象上使用方法链接模式是否可接受/良好实践(比如,返回一个新对象而不是这个)?是否存在实施此解决方案的案例?
我想不出任何弊端,但我想听听你的观点.
我不明白ActionScript3中的值对象和类之间在结构上有什么不同.
如果您决定将其称为一个类,那么任何类都可以成为VO吗?
谢谢.
问题标题中提到的概念在某种程度上是同义词吗?主要差异在哪里(背景,结构,......)可以被视为另一个的子集?以下是维基百科的一些简要定义.
POJO(Plain Old Java Object) 维基百科
在计算软件中,POJO是Plain Old Java Object的首字母缩写.该名称用于强调给定对象是普通Java对象,而不是特殊对象,特别是不是Enterprise JavaBean.该术语由Martin Fowler,Rebecca Parsons和Josh MacKenzie于2000年9月创造:
Run Code Online (Sandbox Code Playgroud)"We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it's caught on very nicely."
Java Bean 维基百科
JavaBeans是Java的可重用软件组件,可以在构建器工具中以可视方式进行操作.实际上,它们是用符合特定约定的Java编程语言编写的类.它们用于将许多对象封装到单个对象(bean)中,以便它们可以作为单个bean对象而不是作为多个单独对象传递.JavaBean是一个可序列化的Java对象,具有一个无效的构造函数,并允许使用getter和setter方法访问属性.
价值对象 维基百科
数据传输对象(DTO),以前称为值对象或VO,是用于在软件应用程序子系统之间传输数据的设计模式.DTO通常与数据访问对象结合使用,以从数据库中检索数据.
商业对象 维基百科
业务对象是一种可理解的实体,是n层面向对象计算机程序中业务层内的一个actor.
有关:
DTO,VO,POJO,JavaBeans之间的区别? JavaBean和POJO有什么区别? DDD:实体和价值对象之间的差异有什么用?
从有效的Java书中可以看出," 如果一个对象是不可变的,那么它总是可以被重用 ".
String s = "shane";
String p = "shane";
Run Code Online (Sandbox Code Playgroud)
此版本使用a single String instance,而不是每次执行时都创建一个新版本.此外,保证对象将被在同一虚拟机中运行的任何其他代码重用,这些代码恰好包含相同的字符串文字.
下面的最终课程也是不可改变的呢?点对象可以重复使用吗?
public final class Point {
private final int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供一个上面的例子immutable class,它的对象/实例可以重复使用吗?我只是对可重用性如何发生感到困惑?
我能够String与IntegerClasses 相关联,但不能与用户定义的类相关联.
如果我有一个付款价值对象,它可以由两个不同的聚合根共享吗?或者我应该复制它?
两种选择都错了!
design-patterns domain-driven-design dry aggregateroot value-objects
贫血模型是没有...的模型
“贫乏域模型是使用软件域模型,其中域对象包含很少或不包含业务逻辑(验证、计算、业务规则等)。”
DTO 是一种缺乏业务逻辑的贫血模型吗?再说一次,一个没有业务逻辑的 balie 对象?
在对具有实体和值对象的域进行建模时,将“基本”值类型与定义好的值对象一起生成是否有意义?
例如,我可以有一个值对象 EmailAddress 或 ProductName。但是仅将 String 作为值对象呢?它是否出于任何充分的理由违反了任何已知的原则?我真正想知道的是,我是否应该/可以将所有可能的属性值定义为值对象,包括 string、bool、int 等。这是错误的还是只是做得很远?不知何故,我觉得我更喜欢真正明确地表达任何具有某种价值的“事物”,而不是留下任何可以解释的东西。你怎么认为?大师们对此有何看法?
我偶然发现的一个参考:
用适当的值对象替换常见的原语(例如字符串)通常是个好主意。虽然我可以将电话号码表示为字符串,但转换为电话号码对象会使变量和参数更加明确(在语言支持时进行类型检查)、验证的自然焦点,并避免不适用的行为(例如对整数 ID 号)。
我正在学习DDD,并且当前正在使用的教程是使用NHibernate实现的,但是由于缺乏经验,我决定使用EF Core 2.1来完成本课程。
但是,我目前对以下内容有些困惑:我有三个类Customer,它们是一个实体和两个值对象(CustomerStatus在其中的值对象ExpirationDate)-像这样:
public class Customer : Entity
{
//... constructor, other properties and behavior omitted for the sake of simplicity
public CustomerStatus Status { get; set; }
}
public class CustomerStatus : ValueObject<CustomerStatus>
{
// customer status is enum containing two values (Regular,Advanced)
public CustomerStatusType Type { get; }
public ExpirationDate ExpirationDate { get; }
}
public class ExpirationDate : ValueObject<ExpirationDate>
{
//... constructor, other properties and behavior omitted for the sake …Run Code Online (Sandbox Code Playgroud) c# domain-driven-design value-objects entity-framework-core-2.1 owned-types
我和我的大学正在讨论领域驱动设计背景下的价值对象和实体。这有点理论化,所以可能不太容易回答。
第一个问题:聚合根可以是值对象吗?
第二个问题:在下图中你可以看到一个领域模型。它包含聚合根和相关的值对象,其中包含聚合根的 ID。

它们是实体还是价值对象?
他们有哪些身份概念?
聚合体的成员具有哪种身份概念?
文章链接:https://www.mirkosertic.de/blog/2013/04/domain-driven-design-example/
谢谢你的帮助
value-objects ×10
entity ×2
java ×2
c# ×1
dry ×1
dto ×1
hibernate ×1
immutability ×1
javabeans ×1
one-to-many ×1
oop ×1
orm ×1
owned-types ×1
pojo ×1