JPA3–双向与级联操作
一 、单向一对多
1.1配置
在一方配置onetomany
@Entity
@Table(name="t_productDir")
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
//配置多方 List/Set
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="dir_id")
@OrderBy("price desc")
private List<Product> products = new ArrayList<>();
多方配置:
@Entity
@Table(name="t_product")
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
1.2保存操作:
不管是先保存一方还是多方,都有额外发送sql ,效率上面比较低,建议使用单向多对一,如果要学习双向 这个也要学习
1.3在使用集合的时候,使用接口 比如List/Set(掌握)
List主要有顺序上面 比如组合就可以使用
Set主要多对多 多对一上面 没有顺序 但是orderby 也可以排序
二、双向多对一或者一对多
2.1配置:
@Entity
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy=”dir”)
// @JoinColumn(name="dir_id")
private Set<Product> products = new HashSet<Product>();
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY) // 实现延迟加载
@JoinColumn(name = "dir_id")
private ProductDir dir;
}
2.2保存代码案例:
public void testManytoOne2() throws Exception{
//保存数据
Product product1= new Product();
product1.setName("华硕飞行堡垒");
Product product2 = new Product();
product2.setName("联想拯救者");
ProductDir dir = new ProductDir();
dir.setName("笔记本电脑");
//设置关系
dir.getProducts().add(product1);
dir.getProducts().add(product2);
product1.setDir(dir);
product2.setDir(dir);
//保存
EntityManager entityManager = JpaUtils.getEntityManager();
entityManager.getTransaction().begin();
//双向的
entityManager.persist(dir);
entityManager.persist(product1);
entityManager.persist(product2);
entityManager.getTransaction().commit();
entityManager.close();
2.3级联操作
配置:
级联保存((mappedBy = "dir" 表示将外键的维护交给多方管理,dir表示多方中字段属性名,,cascade = CascadeType.PERSISIT 表示可以使用级联保存,除了PERSISIT,常用的还有ALL ,remove)
@OneToMany(mapp