.对象之间的关系
1.这里的关系映射指的是对象之间的关系(一对一,一对多,多对多),并不是指数据库的关系(数据库中的关系有:表和表之的关系只有一种外键),本章解决问题是当对象之间处于下列关系之一时,数据库表该如何映射,编程上该如何对待(红色为重点)
1.简化问题
A)怎么写Annotation
B)增删改查CRUD怎么写
2.一对一
A)单向(主键,外键)
B)双向(主键,外键)
4.一对多
A) 单向
B) 双向
5.多对一
A)单向
B)双向
6.多对多
A)单向
B)双向
7.集合映射
a) List
b) Set
c) Map
8.继承关系(不重要)
A)单表
B)多表
C) 一张主表,多张子表
9.组建映射
a) @Embeddable
b) @embedded
.一对一单向关联
问题1:一对一单向和一对一双向有什么区别呀?单向和双向在数据库中的表现都一样吗?没错,在数据库里面一对一单向和一对一双向其实没区别,在后面学的一对多,多对多都一样,数据库没什么区别,但是它的区别主要在外面java程序里面有区别(eg,(hibernate-
One2one-test)如果我们双向的,我们可以通过Wife找到Husband,如果我们是单向我们就不同通过Wife找到Husband; 所谓单向双向的映射的意思是:在同样的数据库的基础之上,
你要实习单向的编程模型你该怎么映射,如果你要实现双向的变成模型你该怎么映射
1.一对一单向外键关联
A) Annotation: @OneToOne @JoinColunm
B) xml: <many-to-one name="studentcard" column="studentId" unique="true"/>
2.一对一双向外键关联(规律:凡是双向关联,mapped必设,因为根本都没必要在2个表中都存在一个外键关联,在数据库中只要定义一边就可以了)
A) Annotation: @OneToOne(mappdBy=””)
B) xml:<many-to-one 和<one-to-one; 用<one-to-one这样只会在一张表上生成外键;而不要用 <many-to-one
,因为 <many-to-one会在2张表上生成外键关联
3.一对一单向主键关联(不重要)
A)Annotation :@OneToOne @PrimaryKeyJoinColumn
B) xml: <one-to-one name="studentcard" constrained="true"/>
4.一对一双向主键关联(不重要)
主键映射
1.项目 :
2.对象关系:一个对象是另外一个对象的一部分
3.数据库表:一张表
4.Annotation: @Embbedable @Embbeded
5.Xml: <component
多对一与一对多
数据库表的设计:永远在多的方加外键
1.多对一单向关联
A) annotation: @ManyToOne
B) xml: <many-to-one
2.一对多单向关联
A) annotation :@One2Many
B) xml :
3.一对多(多对一)双向关联
4.多对多(多对多在数据库中如何实现了呢?是通过建一张中间表实现的)
A)单向关联
1.eg:老师和学生的关系,老师需要知道自己教了那些学生,而学生不知道有那些老师教自己(java程序
2.数据库:中间表
3.@many2many
4.xml:<many2many
B)双向关联:
1:老师知道自己教了那些学生,学生也知道有哪些老师教自己
关联关系中的CRUD_Cascade_Fetch
1. 设定cascade :可以设定在持久化时对于关联对象的操作(CUD,R归Fetch管)
2. cascade仅仅是帮我们省了变成的麻烦而已,不要把它的作用看的太大
A)Cascade的属性指明做什么操作的时候关联对象是绑在一起的
B) merge=save+ update
C)refresh =A里面需要读到B 改过之后的数据
3. 铁律:双向关系在程序中要设定双向关联
4. 铁律:双向 mappedBy
5. Fetch
A)铁律 :双向不要两边设置Eager(会有多余的查询语句发出)
B)对多方设置fetch的时候要谨慎,结合具体引用,一般用Lazy不用eager,特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑)
6. 要想删除或者更新,先做load,除了精确知道ID外
7. O/RMapping变成模型
A) 映射模型
I . J pa annotation
Ii. Hibernate annotation extension
Iii. Hibernate xml
Iv. Jpa xml
B) 编程接口
I. Jpa
Ii. hibernate
8. delete:
I.在删除以前我们要先load一下,如果想消除关联关系,先设定关系为null,再删除对应记录,如果不删除记录,该记录就变成垃圾记录
Ii. HQL
9. 如果指定@one2one的属性fetch为FetchType.LAZY,会延长对于关联对象的价值,
10.树状结构的设计(至关重要)
A) 在同一个类中使用one2many 和many2one