1 单向的一对多
(不会专门使用)
1.1 配置
1方配置(泛型必须加)
@OneToMany
@JoinColumn(name="dir_id")
private Set<Product> products = new HashSet<>();
}
1.2 保存
无论怎么保存,都在额外发送sql ,所有一般不用单向一对多
1.3 查询
lazy加载
1.4集合的使用
在定义实体类的时候,使用到集合时使用集合接口
List/Set区别
List是有序 可以重复
Set 无顺序,不能重复
Set 一般使用在多对多 或者 一对多
List 一般组合 一般使用单据上面
1.5 集合排序
@OrderBy("price DESC")
2 双向的一对多 或者 多对一
配置:尽量让多方来维护关系,一方放弃管理mappedBy
@OneToMany(mappedBy = "dir")
2.1级联操作保存
级联:指操作一方数据的同时可以一并操作多方的数据
分类:
级联保存@OneToMany(cascade = CascadeType.PRESIST)
级联删除@OneToMany(cascade = CascadeType.REMOVE)
孤儿删除:让一方解除关系 ,才能从1方删除多方(注意:只能应用在一对多关系)
强级联:@OneToMany(cascade = CascadeType.ALL,mappedBy = "dir",orphanRemoval = true)
3 单向多对多
3.1单向多对多配置
一个用户可以拥有多个角色,一个角色 可以拥有多个用户
User
@ManyToMany
@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns ={@JoinColumn(name="role_id")} )
private Set<Role> roles = new HashSet<>();
4 双向多对多
4.1配置
role
@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")},
inverseJoinColumns ={@JoinColumn(name="user_id")} )
private Set<User> users = new HashSet<>();
user
@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns ={@JoinColumn(name="role_id")} )
private Set<Role> roles = new HashSet<>();
4.2操作
级联删除
@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns ={@JoinColumn(name="role_id")} )
5 一对一
重点配置:
(1)建议使用单向 多 对一 不要使用单向一对多
(2)如果要使用1对多,尽量使用双向配置,让1方放弃管理
(3) 多对多 如果想相互获取数据 配置双向,如果单向操作 就配置单向
(4) 使用 多对一 来代替一对一 ,如果实在使用一对一 使用唯一外键的方式