JPA映射关系

单向一对一

onetoone;双向两边都写(用的很少),在实际中一般一对一直接写在一个表里面,所以了解这个就可以了。

单向一对多

onetomany;(几乎不用但是依然要求必须掌握,因为我们在使用双向一对多还会用到单向一对多的相应配置。),使用list或者set集合,并且会创建第三方中间表,对其进行一定优化(必须配置外键id,否则会多生成一张表,形成多对多的关系@JoinColumn(name = "dir_id"))可省略中间表,后sql语句也太繁琐,而且优化不了,所以一般单向一对多都是变样用多对一

单向多对一

manytoone;没有集合默认时迫切加载@ManyToOne(fetch = FetchType.EAGER),有集合默认时懒加载(@ManyToOne(fetch = FetchType.LAZY))

双向多对一或一对多

onetomany 或者manytoone对两边都进行配置;;
mappedBy = "dir"表示一方的关系参照多方Prodcut属性dir来管理@OneToMany(mappedBy = "dir")
  @ManyToOne(fetch = FetchType.LAZY) // 实现延迟加载 JoinColum设置了外键的名字,不配置默认一方属性名_id  @JoinColumn(name = "dir_id")
保存数据分析
前言:添加数据的时候我们选择比较多,因为现在是双向的,所以在添加的时候有多种选择
选择一:在java代码中让多方来维护关系(性能高),类似于单向多对一;
选择二:在java 代码中让一方来维护关系(性能低-如下面的代码),类似于单向一对多。
级联保存
添加只调用一次添加功能,自动把相关联的添加
映射配置:@OneToMany(cascade = CascadeType.PERSIST, mappedBy = "dir")
联级删除
1、级联删除:删除一方,然后级联删除多方(危险操作)
	删除商品分类(ProductDir,一方),它下面的所有商品(Product,多方)都要删除,如果我们直接删除的话,就发现报一个错(外键关系不能删除) 所以必须配置一个级联 cascade = CascadeType.REMOVE
2、从一方去删除一个解除关系(外键的值为null)的多方:先获取一方,在删除一个多方
3、从一方去删除所有关系的多方:先获取一方,在删除所有多方:::dir.getProducts().clear();

单向多对多

两边都要配置@ManyToMany
其次:@JoinTable(name = "中间表名",joinColumns = {@JoinColumn(name = "对应的行表名")},inverseJoinColumns = {@JoinColumn(name = "相反的行表名")})
级联保存
@ManyToMany(cascade = CascadeType.PERSIST)
联级删除
1、删除user1(由Hibernate自动处理,先删除中间表,再删除user1) entityManager.remove(user);
2、删除user1的所有包含角色(role1,role2),不能删除user1(只删除中间表) user.getRoles().clear();
3、删除user1的一个角色,不能删除user1(只删除中间表)User user = entityManager.find(User.class, 1L);Role role = entityManager.find(Role.class, 1L);user.getRoles().remove(role);