欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java Persistence API 实体映射的方向问题 JavaJPAORM 

程序员文章站 2022-07-16 20:26:08
...
EJB3.0包含了JPA,Java持久性接口。JPA接口其中一个重要部分就是ORM,就是对象和关系的映射,也被成为实体映射。
实体映射中存在方向问题:单向关系和双向关系。

单向关系:两个实体中只有一个实体指向另一个实体(知道该关系的存在),而另一实体没有指向这个实体(另一实体不知道该关系的存在)
例如 如果将人和地址建模如下:Person ---------> Address,就是单向关系.
数据库表:PERSON(id,name,...,address),ADDRESS(id,country,city,street,building,...)
其中PERSON表中的address是外键,即为ADDRESS表中的id,只有PERSON知道关系的存在(能从Person导向Address)
而ADDRESS不知道PERSON(无法从Address导向Person)
在单向关系中只有拥有端知道关系的存在,即Person就是拥有端(Person拥有这个关系,看箭头方向)
在单向关系中,有外键的即为拥有端。

双向关系包括拥有端(Owning Side)和反向端(Inverse Side),而单向关系只有拥有端。

拥有端决定持久性如何进行数据库中关系的更新(就是表更新)。

双向关系

在双向关系中,每个实体拥有一个指向另一个实体的字段或者属性。通过这个字段或者属性,一个实体类能够访问其相联系的对象。如果一个实体拥有相联系的字段,我们说,这个实体知道相联系的对象。例如如果订单知道它拥有的每个订货商品,并且每个订货商品知道它从属的订单,我们说,订单和订货商品拥有双向关系。

双向关系必须遵循下列规则:
  • 双向关系的反向端(Inverse Side)必须通过@OneToOne,@OneToMany,@ManyToMany注释的mappedBy元素来指定其拥有端(Owning Side)。这个元素指明这个关系的拥有者实体的属性或者字段。
  • 多对一或者多对多的多的那一端,不能定义mappedBy元素。多的那一端永远是关系中的拥有端。例如雇员和部门一般是双向多对一的关系,所以多的那一端,也就是雇员,不能定义mappedBy元素,雇员永远是雇员和部门关系的拥有端。
  • 对于一对一的双向关系,拥有外键的那一端是拥有端。
  • 对于多对多的双向关系,任何一端都可以是拥有端。
单向关系

在单向关系中,只有一个实体拥有指向另一个实体的相关字段或属性,而另一个实体没有指回来的字段或属性。例如订货商品(即已经放入购物车的商品)拥有一个指向产品的字段,但是产品没有指向订货商品的字段。也就是说,订货商品知道自己属于那种产品,但是产品不知道哪一个订货商品指向了自己。

查询和方向

JPA的查询语言经常跨越关系,关系的方向性决定查询能够从一个实体到另一个实体。例如一个查询能够从订货商品跨越到产品,反过来却不行。但是订单和订货商品却可以双向导航。

级联删除和关系

有些实体是相互依赖的。例如订货商品是订单的一部分,如果订单被取消了,订货商品也应该被删除。这被称为级联删除。
例如,如果消费者被删除了,其订单也就没有了:
@OneToMany(cascade=REMOVE, mappedBy="customer") //一个消费者对应多个订单,多的那一端是订单,订单表中的customer字段为mappedBy元素
public Set<order> getOrders() { return orders; }//设置级联删除,如果消费者被删了,订单也被删了。</order>
相关标签: Java JPA ORM