值和关联的比较
值没有独立的生命周期,完全从属于所属的实体,是实体的内在组成部分。它们(无论单值还是多值)随着实体的保存而自动保存,亦随着实体的删除而自动删除。因此,比起实体来说,管理值对象简单的多。
举例来说,上面的例子中,实体PersonalBuyer
拥有一个集合类型为Map
的多值值属性imInfos
,用于记录买家的各种即时消息应用(例如QQ
、微信、Whatsapp
、Skype
等)的账号。当我们往这个集合中添加或删除一些条目,或者变更了部分条目的内容时,只需要直接保存PersonalBuyer
实体,这个集合就会自动保存,不需要区分那些条目是新增的,哪些条目已经删除,哪些条目又是原有的条目做了内容更改。如果这个集合是个实体的集合,就不会有这样的便利。你必须分别针对增/删/改的条目分别处理,还要正确地指定关联,一不小心还可能会在数据库中留下很多孤儿对象。
另一个区别是删除。如果属性是单值或多值的简单值/值对象。那么,删除实体的时候,这些单值或多值的值对象也会自动删除,不需要分别处理。如果属性是关联属性,情况将大大不同。由于每个实体都有独立的生命周期,删除一个实体不会自动删除它关联的实体(除非添加某些特殊注解),甚至会由于违反引用完整性而拒绝删除。这时候你需要先删除所有引用的实体,才能删除被引用的实体。
如果可能,尽量将对象建模为值对象而不是实体。
最重要的一点是要记住:值(包括简单值和值对象)属于内部状态,而关联属于外部关系。