JPA --------一对多双向关联与级联操作
Order.java
???? CascadeType.REFRESH:级联刷新,也就是说,当你刚开始获取到了这条记录,那么在你处理业务过程中,这条记录被另一个业务程序修改了(数据库这条记录被修改了),那么你获取的这条数据就不是最新的数据,那你就要调用实体管理器里面的refresh方法来刷新实体,所谓刷新,大家一定要记住方向,它是获取数据,相当于执行select语句的(但不能用select,select方法返回的是EntityManager缓存中的数据,不是数据库里面最新的数据),也就是重新获取数据。
???? CascadeType.PERSIST:级联持久化,也就是级联保存。保存order的时候也保存orderItem,如果在数据库里已经存在与需要保存的orderItem相同的id记录,则级联保存出错。
???? CascadeType.MERGE:? 级联更新,也可以叫级联合并;当对象Order处于游离状态时,对对象Order里面的属性作修改,也修改了Order里面的orderItems,当要更新对象Order时,是否也要把对orderItems的修改同步到数据库呢?这就是由CascadeType.MERGE来决定的,如果设了这个值,那么Order处于游离状态时,会先update order,然后for循环update orderItem,如果没设CascadeType.MERGE这个值,就不会出现for循环update orderItem语句。
???? 所以说,级联更新是控制对Order的更新是否会波及到orderItems对象。也就是说对Order进行update操作的时候,orderItems是否也要做update操作呢?完全是由CascadeType.MERGE控制的。
???? CascadeType.REMOVE:当对Order进行删除操作的时候,是否也要对orderItems对象进行级联删除操作呢?是的则写,不是的则不写。
????如果在应用中,要同时使用这四项的话,可以改成cascade = CascadeType.ALL
???? 应用场合问题:这四种级联操作,并不是对所有的操作都起作用,只有当我们调用实体管理器的persist方法的时候,CascadeType.PERSIST才会起作用;同样道理,只有当我们调用实体管理器的merge方法的时候,CascadeType.MERGE才会起作用,其他方法不起作用。??? 同样道理,只有当我们调用实体管理器的remove方法的时候,CascadeType.REMOVE才会起作用。
???? 注意: Query query = em.createQuery("delete from Person o where o.id=?1");这种删除会不会起作用呢?是不会起作用的,因为配置里那四项都是针对实体管理器的对应的方法。