实体通常指具有唯一标识的具体对象或事物。实体通常具有自己的生命周期,可以被创建、修改和删除。在数据库中,实体通常对应着数据库表的一行记录,每个实体具有唯一的标识符(通常是主键)。
比如,一个人可以被视为一个实体,因为每个人都有唯一的身份证号码作为标识符,并且每个人具有自己的生命周期,可以被创建、修改和删除。
值对象通常指没有唯一标识的对象或数据类型。值对象通常不可变,一旦创建就不能修改,只能通过创建新的值对象来替换原来的值对象。在数据库中,值对象通常对应着数据库表的一组字段,每个值对象不具有唯一的标识符,而是通过一组字段来描述其属性。
比如,一个地址可以被视为一个值对象,因为它没有唯一标识符,而是由一组字段描述,例如国家、省份、城市、街道和门牌号等。并且地址通常是不可变的,一旦创建就不能修改,只能通过创建新的地址对象来替换原来的地址对象。
假设我们正在设计一个电商系统,需要设计一个订单类。订单包含多个订单项,每个订单项对应着购买了某个商品的数量和价格。
首先,我们定义一个订单项类,它包含订单号、商品名称、数量和单价4个属性,并且它们都是可变的,因为每个订单项都可以修改:
public class OrderItem {
private String productName;
private int quantity;
private BigDecimal unitPrice;
privatr String orderNo;
//setter 和 getter
}
然后,我们定义一个订单类,它包含订单号、订单项列表、订单状态和订单总价四个属性。
public class Order {
private long orderId; // 实体
private List<OrderItem> orderItems; // 值对象
private OrderStatus status;
private BigDecimal totalPrice;
}
我们在数据库中存储订单的时候,可以这样存储:
orderId | status | totalPrice | orderItems |
---|---|---|---|
2023021811223344 | CONFIRMED | 120 | {"productName":"《深入理解Java核心技术》 作者 Hollis","quantity":100,"unitPrice":129} |
以上,订单就是一个实体,因为每一个订单对应一个单独的数据库记录,并且有唯一表示,就是订单号。而订单条目就是值对象,他是依赖于实体进行存储的。
在数据库中把数据取出来的时候,是可以把orderItems这个json类型的字段转成我们定义好的OrderItem的对象的。这样更方便我们进行操作。