Hibernate 关系映射注解详解--一对多

一对多和多对一注解及其属性详解:

-------------------------------------------------------------------------------------

@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键 

属性:
optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true 
fetch:表示抓取策略,默认为FetchType.EAGER (其实就是设置延迟加载和立即加载)
cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作 (见最后cascade属性取值) 
targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity. 

 

-------------------------------------------------------------------------------------

@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段. 

属性:
fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存 
cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除 
例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除

mappedBy 
1>只有OneToOneOneToManyManyToMany上才有mappedBy属性,ManyToOne不存在该属性; 
2>mappedBy标签一定是定义在被拥有方的,他指向拥有方; 

理解:在映射双向一对多时会用到,使用时一定是在被拥有方Grade(被Student拥有)中定义,指向拥有方Student中的Grade对象属性。

3>mappedBy可以理解为,拥有方Student能够自动维护跟被拥有方Grade的关系(下面示例有说明),当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的(即生成中间表) 
4>mappedByjoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方Student关联被拥有方的字段Student中的grade字段)存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。 

你可能感兴趣的:(hibernate)