单向一对多
单向一对多用得比较少(性能差),但是依然必须掌握,因为我们在使用双向一对多还会用到单向一对多的相应配置。
映射配置
单向一对多(性能太差)
无论不管怎么保存(改变persist代码位置)
它都会至少执行5条SQL语句完成保存功能
而完成同样的功能,我们使用单向多对一可以优化为3条。 因此,我们一般不使用单向一对多(原因:性能太差)
延迟加载
默认懒加载
可以在注解里面设置 ,但是迫切加载还耗性能
这个fetch的值默认为FetchType.LAZY,则实现延时加载,
而我们修改成FetchType.EAGER后,不管有没有找类型项目的商品,它都会马上发送SQL来去查询数据。
在配置映射关系的时候如果是@ManyToOne(fetch=FetchType.LAZY),@OneToMany(fetch=FetchType.LAZY) ,@ManyToMany(fetch=FetchType.LAZY) 都是默认使用延迟加载提高性能的。
只有Many在后面都是使用延迟加载获取数据。
判断集合是否有值
多态
采用多态的写法 从分类获取产品
PersistentSet 它实现接口Set HashSet也实现Set接口
HashSet? --》org.hibernate.collection.internal.PersistentSet 它是Set的实现类
HashSet 和PresistentSet它是兄弟关系 ,不是父子关系 ,一句 在实体类定义 使用Set接口
PersistentBag 是底层给我实现接口实现类 它是List的实现类 PersistentBag它和ArrayList也是兄弟关系
在定义的时候 使用接口比如List和Set
双向多对一/双向一对多
前言:添加数据的时候我们选择比较多,因为现在是双向的,所以在添加的时候有多种选择。
选择一:在java代码中让多方来维护关系(性能高),类似于单向多对一
选择二:在java 代码中让一方来维护关系(性能低-如下面的代码),类似于单向一对多。
使一方放弃维护
一般是交给多方来来维护
级联保存
比较危险
目的 :
我们想要达到一个什么效果呢?
我们直接保存商品类别(ProductDir,一方),就把它对应的商品(Product,多方)也一起保存起来!
配置中间表
查询
删除的时候比较危险 ,可以在维护的一方选择想要的配置避免删除过多的数据
单向多对多
我们保存三个用户(user),两个角色(role)来进来多对多的测试
一个用户拥有多个角色
反过来一个角色也可以拥有多个用户
相当于2个多对一叠加变成多对多,多了一张中间表user_role
单向:用户可以找到多个角色
同样配置中间表
保存数据
创建两个用户三个角色
中间表数据
双向多对多
双向多对多就是配置两个多对多即可,我们直接用练习来完成双向多对多的学习
多对多的操作->都是符合开发时的正常操作
1.级联保存
2.删除user1(由JPA自动处理,先删除中间表,在删除user1)
user必须要管理中间表的权限,没有在user这个配置mappedBy修改角色:先删除在添加
user必须要管理中间表的权限,没有在user这个配置mappedBy
关系user1(role1,role2)->关系user1(role1,role3)
3.级联删除(一边配置,危险)
4.级联删除(二边配置,非常危险)
在两边配置信息
删除用户数据
如果有级联会把删除关联的数据全部删除
比如删除用户2
而用户2里面有三个角色
这是会把用户2和三个角色一起删除掉
导致三张表里面只剩下 用户表里id为1的用户
其余的数据全部被删除
非常危险
如果没有级联
就只会删除中间表数据和当前删除的用户
一对一
使用相对较少,但依然要掌握
把QQ的主键付给QQ空间外键 并且唯一,达到只能通过唯一的ID进入到固定的QQ空间