值和关联的比较

值没有独立的生命周期,完全从属于所属的实体,是实体的内在组成部分。它们(无论单值还是多值)随着实体的保存而自动保存,亦随着实体的删除而自动删除。因此,比起实体来说,管理值对象简单的多。

举例来说,上面的例子中,实体PersonalBuyer拥有一个集合类型为Map的多值值属性imInfos,用于记录买家的各种即时消息应用(例如QQ、微信、WhatsappSkype等)的账号。当我们往这个集合中添加或删除一些条目,或者变更了部分条目的内容时,只需要直接保存PersonalBuyer实体,这个集合就会自动保存,不需要区分那些条目是新增的,哪些条目已经删除,哪些条目又是原有的条目做了内容更改。如果这个集合是个实体的集合,就不会有这样的便利。你必须分别针对增/删/改的条目分别处理,还要正确地指定关联,一不小心还可能会在数据库中留下很多孤儿对象。

另一个区别是删除。如果属性是单值或多值的简单值/值对象。那么,删除实体的时候,这些单值或多值的值对象也会自动删除,不需要分别处理。如果属性是关联属性,情况将大大不同。由于每个实体都有独立的生命周期,删除一个实体不会自动删除它关联的实体(除非添加某些特殊注解),甚至会由于违反引用完整性而拒绝删除。这时候你需要先删除所有引用的实体,才能删除被引用的实体。

如果可能,尽量将对象建模为值对象而不是实体。

最重要的一点是要记住:值(包括简单值和值对象)属于内部状态,而关联属于外部关系

results matching ""

    No results matching ""