1 单向的一对多
1.1 配置
多方
@Entity@Table(name="t_product")
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
}
1方配置
@Entity
@Table(name="t_productDir")
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
//泛型必须添加进去
@OneToMany
@JoinColumn(name="dir_id")
private Set<Product> products = new HashSet<>();
}
1.2 保存
无论怎么保存,都在额外发送sql (所有一般不用单向一对多)
1.3 查询
lazy加载
//现在使用 Set集合 HashSet 打印出来 PersistentSet
//PersistentSet 它是Set的实现类 和 HashSet一样 ,PersistentSet 和 HashSet都是
//Set的实现类,是兄弟关系 --在定义实体的集合的时候,不要定义HashSet
//PersistentBag 也是 List的实现类,和ArrayList一样,ArrayList和PersistentBag都是
//List的实现 ,是兄弟关系 --在定义实体的集合的时候,不要定义ArrayList
总结:在定义实体类的时候时候,如果使用到集合,就使用集合接口的方式
1.4集合的使用
现在在定义集合的时候,什么情况下使用List ,什么情况下使用Set?
List/Set区别?
List是有序 可以重复 Set 无顺序,不能重复
Set 一般使用在多对多 或者 一对多
List 一般组合 一般使用单据上面
1.5 集合排序 orderby
配置
@OneToMany
@JoinColumn(name = "dir_id")
@OrderBy("price DESC")
private List<ProductSet> products = new ArrayList<ProductSet>(); = new HashSet<ProductSet>();
2 双向的一对多 或者 多对一
配置:尽量让多方来维护的关系,一方放弃管理mappedBy
@OneToMany(mappedBy = "dir")
private List<Product> products = new ArrayList<>();
2.1级联操作保存
级联:就是我操作一方数据,就同时可以多方的数据也一并操作
persist(dir);
级联分为:级联保存 级联删除
@OneToMany(cascade = CascadeType.PRESIST)
2.2 级联删除
@OneToMany(cascade = CascadeType.REMOVE)
2.3 孤儿删除
让一方解除关系 ,才能从1方删除多方
@OneToMany(cascade = CascadeType.REMOVE,mappedBy = "dir",orphanRemoval = true)
2.4 强级联 --项目里使用 组合关系(单据)
@OneToMany(cascade = CascadeType.ALL,mappedBy = “dir”,orphanRemoval = true)
3 单向多对多
3.1单向多对多配置
多对多
用户 和 角色
一个用户可以拥有多个角色 比如 强哥 用来 管理员角色 学生角色
一个角色 可以拥有多个用户 比如 管理员角色 有 强哥或者航哥
User
@Entity
@Table(name="t_user")
public class User {
@Id
@