`
qinya06
  • 浏览: 584070 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java hibernate 级联cascade和控制反转inverse

 
阅读更多
@OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = {CascadeType.REMOVE})
	@OrderBy("createDate asc")
	public Set<OrderLog> getOrderLogSet() {
		return orderLogSet;
	}

1、关于mappedBy的含义:
a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
b) mappedBy标签一定是定义在the owned side(被拥有方的),他指向the owning side(拥有方);
c) mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系;
    当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的。

级联一般用在OneToOne和OneToMany上,
这也是hibernate官方的推荐,有时候我们在开发中也用在          
ManyToOne,ManyToMany上,
hibernate的关联关系,重点在理解级联cascade和inverse
1、cascade一般用在级联保存,级联更新,级联删除上
ALL,

PERSIST,调用session.persist()时触发
MERGE,调用session.merge()触发   
REMOVE,调用session.delete()触发   
REFRESH,    
DETACH

由于hibernate的关联关系,重点在理解级联cascade和inverse,故补充inverse
inverse,英文意思是反向,反转。在这里可以理解为控制反转,
也就是说实体间的关系由谁控制,
所以inverse用在实体关联上。如OneToOne,OneToMany,ManyToMany

在OneToMany中,如果不指定inverse,那么hibernate会去找默认的表来维持关系。
例如用老师和课程两个实体来说明,假设teacher和course是OneToMany的关系,

配置如下:

//通过外键teacher_id关联teacher,inverse通过mappedBy来设置
@ManyToOne(cascade={CascadeType.MERGE})
	@JoinColumn(name = "teacher_id")
	
private Teacher teacher;


@OneToMany(mappedBy="teacher",fetch=FetchType.LAZY,
  cascade={CascadeType.MERGE,CascadeType.REMOVE})
	
private Set<Course> courses = new HashSet<Course>();

在这里指定teacher的属性courses的关系由关联实体Course的teacher属性维持,
如果不配置,则会去找关联表teacher_course来维持关系。
OneToOne和ManyToMany大同小异
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics