值对象持久化也用ManyToOne吗?

11-01-13 wind13
我的问题是:

public class SomeModel{

@ManyToOne

public Money money;

}

注意上面那个 @ManyToOne,请大家看一下这样合适不?

Money 在这个环境中业务分析中就是个值对象,我的问题是要不要加这个@ManyToOne的注释,我们知道加上这个注释,就会另建一个表保存Money,里面当然是Money的金额、币种等信息,如果不加,这个属性存入数据库中是什么形式呢?

就这样的情况,需要将值对象持久化时,还有什么要注意的吗?有没有人有这方面的经验,特别是最佳实践分享一下?

[该贴被wind13于2011-01-13 10:44修改过]

         

oojdon
2011-01-13 11:25
如果是Hibernate的话,值对象用component映射

这样你其实不用管它怎么持久的,你获取根实体的时候就自动得到了这个值对象,至于数据库中,是放在实体表中的。

如果要用注解,用@Embeddable标注这个值对象。

实体和值的分析需要DDD知识,见下面banq老师的回答。

[该贴被oojdon于2011-01-13 11:37修改过]

banq
2011-01-13 11:26
值对象是不能单独存在的,一般都是在聚合体中,也就是从属实体,实体要保证值对象的不变性,值对象实际就是实体的一个组成部分。

至于“是否需要持久”,取决于实体,如果需要,通过repository去持久,至于如何具体持久,你这个ManytoOne是属于“如何实现持久”范围,属于底层技术,如何写好仓储Repository?

“是否需要”和“如何实现”分别属于“是什么”和“怎么做”的问题,是战略和战术问题,是方向和通往道路的问题。所以,值对象是否需要持久取决于其父对象实体;如何实现则取决于Repository内部机制。

你的问题中:“也用ManyToOne”属于“怎么做”的问题,划分为Repository内部机制。具体解释:

http://www.jdon.com/jivejdon/thread/35836/15#23131443

不知我说明白没有?这也说明使用Hibernate或JPA这些具体ORM机制会干扰我们高层们的思维。

SpeedVan
2011-01-13 14:43
值对象,说得简单点就是实体属性的规划化,他把多个零散相关的属性组成一个整体,他的本质仍然是实体的一个属性,所以是内聚于实体内。只是值对象不拥有setter方法(可以理解为一个状态,状态一个时刻是固定的)。所以回到数据库中仍然是实体的属性。若果你不需要保存这个值的变化历史,则不需要独立表出来,直接保存在数据库的实体上。

回到标准点的值对象,值对象是依附在实体上的,因为他不具有唯一标识,要找到它的话,需要先找到实体,再从实体中获得。OO思维中,把数据都封装了,所以只存在对象概念,String str = "1",这"1"就是一个值对象,所以仓储也是一个样。不过若果只想更新某个部分,则在同一个实体仓储中加入部分更新方法就行了。

[该贴被SpeedVan于2011-01-13 15:03修改过]

wind13
2011-01-13 16:04
谢谢oojdon,我想要的正是这个annotation @Embeddable标注

也谢谢 banq,让我从更高层次的概念上理解了一下“是什么”和“怎么做”的问题。

猜你喜欢