关于hibernate多重映射 ,谁是拥有端 ,谁是反向端的问题

下面是关于ORM实体映射实例及说明:

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; }//设置级联删除,如果消费者被删了,订单也被删了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值