Hibernate关系映射
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-140.html 1、关系映射: A.一对一:主键关联:主键关联 单向:外键关联 双向:外键关联或中间表 联合主键: @OneToOne:一对一关联关系,注解在对方类引用的get方法上 @Join
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-140.html
1、关系映射:
A. 一对一:主键关联:主键关联
单向:外键关联
双向:外键关联或中间表
联合主键:
@OneToOne:一对一关联关系,注解在对方类引用的get方法上
@JoinColumn:设置关联的外键名,name属性
@PrimaryKeyJoinColumn:设置主键关联
@JoinColumns设置联合主键
xml使用
B. 一对多:一方添加多方的Set集合
注解:@OneToMany和@JoinColumn指定多方的外键名
Xml:
C. 多对一:在多方加外键
注解:@ManyToOne
Xml:
注:一对多、多对一的双向关系,交给多方维护关系,在@OneToMany设置mappedBy
属性,xml在
D. 多对多:
单向:
注解:在维护集合上@ManyToMany,@JoinTable指定中间表名和列名,
JoinColumns、JoinColumn、inverseJoinColumn
Xml:
双向:
注解:单向的基础上在另一边的集合设置@ManyToMany(mappedBy="")
Xml:另一边也设置
E. 组件映射:作为表的一部分的Bean,不作为实体,如学生证作为学生实体的一部分;
实体中的组件引用加@Embedded
Xml中用
注:(1)双向关联mappedBy属性必须设定,xml用
表示关系由对方主导;
(2)双向关系要很注意在调用过程中可能出现实体无限循环调用的堆栈溢出的危险;
2、关联关系下的增删改查:
(1) 关联关系设置cascade级联操作,只影响增删改;
(2) 若被关联对象为一方,默认直接取出来,EAGER;
(3) 若被关联对象为多方,默认是延迟加载,LAZY;
(4) fetch设置查询读取级联操作,只影响查询操作,默认LAZY;
(5) 双向的关联关系有些操作会导致重复操作,注意设置延迟加载避免多余操作;
(6) 删除:先查询再删除,防止级联删除--破坏掉内存实体的关联关系或HQL;
3、集合映射:
(1) 常规方式:Set;
(2) List:加注解和Set一样,List是为了能够排序,@OrderBy指定排序参数;
(3) Map:key为不可重复子段(多数为主键),@MapKey;value为集合元素实体,较适用于查询;
4、继承映射:
(1) 少数属性继承关系:Single-Table,一张表存储所有类,加一个类型标记位子段;
(2) 每个类各自一张表:Table-per-Class,没法存储继承多态关系,继承多态调用麻烦,需要维护每个实体主键的唯一性;
(3) 按照继承关系,父类有表,子类也有表,但是共同属性在父表中:Joined,父表和子表要设置主键关联,维护主键唯一性,查询必须连接表,新子类要建新表;
注解:A. @Inheritance:注明继承映射,指定继承映射策略,用于父类;
B. @DiscriminatorColumn:标明类的类型标记位,用于父类;
C. @DiscriminatorValue("标记位值"):类类型标记位值;
5、树状映射:
(1)对象设计:id、父亲节点引用、孩子节点集合、其他的节点内容;
(2)表设计:id、parent_id、其他节点内容列;
(3)设置@Entity、@Id、主键生成策略、@ManyToOne(设置外键列"parent_id")、@OneToMany(mappedBy="parent");
(4)设置修改级联,LAZY还是EAGER具体分析才选择;
(5)设置好对象间父子关系,存入数据库即可;
(6)查询使用递归方式查询;
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-140.html