2009年5月12日星期二

ORM Relationships

DataNucleus的文档不错,写得很精要,可以读一下:Relationships

在ORM的表述中经常用到 Entity这个词,entity对应于OO的class,对应于DB的Table。

relationship: 1-1, 1-N, N-1, N-M,N-M是bidirectional的,其它的都分为unidirectinal 或者bidirectional。

各种关系中的life dependence是不同的,用GAE的JPA文档中的话来说就是owned和unowned关系。用UML的术语就是: aggregation和composition关系。聚集和合成是很强的耦合关系,在GAE中就是owned关系。在hibernate 中,这种关系就可以用来表达。如果用来表达,那么CascadeType就要进行合适的设置来表达owned或是unowned。CascadeType参数是跟对象生命期有关的。

one-to-one:
1)两个Entity共享主键。
2) Foreign Key。

Assigning Relationships:
With a bidirectional relation you must set both sides of the relation 。

Persisting Relationships - Reachability:
persistence-by-reachability。

Managed Relationships:

Casecading:
casecading要解决的问题是,你对一个object进行持久化操作时,它的域对象是否也执行相应的持久化操作。DataNucleus的casecading例子中描述的情景不错。一个“驾驶员”有一个“驾驶执照”,同时还拥有多辆“汽车”。当驾驶员不存在了,执照也跟随被删除,但是汽车不该被删除。如果汽车被删除,那么驾驶员应该还存在。这是符合现实常理的。用casecading的annotation解决此问题:
@OneToOne(cascade=CascadeType.ALL)
@OneToMany(mappedBy="owner", cascade={CascadeType.PERSIST, CascadeType.MERGE})
@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})

想建立coder到project的many-to-many映射,但是GAE server却总是报错,才想起GAE对JPA中的
“多对多”是不支持的。需要在各个类中添加Key的集合,来模拟多对多。