OID、Cascade、API聚合与Inverse策略

前端之家收集整理的这篇文章主要介绍了OID、Cascade、API聚合与Inverse策略前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、OID(Object ID),即实体ID,它的两种常用生成策略是native和assigned,其中native

表示由数据库自动生成实体对象的ID,Hibernate则不需要去维护关系外键,assigned

表示在保存保存实体之前由程序指定;cascade表示在操作实体时是否支持级联操作它所

关联的实体(默认值为none,表示不发生任何DML级联操作),inverse表示操作当前实

体之后是否支持继续维护关系表外键(默认值是false,表示当前实体被操作后可能会

维护关系外键),API聚合表示在程序中是否注入关联实体(即:级联式API),在注入了

关联实体且cascade不为none的情况下在操作当前实体之后将采用级联方式操作关

联实体,在注入了关联实体且inverse=false的情况下将维护关系外键,如果没有注

入关联实体则仅仅操作当前实体

2、这几者之间是相互发生作用和影响的,比如在独立实体的级联保存操作中,如果依赖

实体的ID生成策略是assigned则级联保存依赖实体时就会触发对从表中实体ID是否

发生重复的检查,这可能会引起多次IO操作,降低DML操作效率,反过来,如果操作依赖

实体时(必须注入独立实体,因为它要维护外键),独立实体方的ID生成策略是

assigned则同样可能会引发对主表的多次IO检查

3、ID的生成策略是我们不能任意选择的,它多数情况下是依赖于业务需求和设计,因此

为了提升DML的操作效率,我们更多的时候是考虑分别操作独立实体和依赖实体,而不

是采用级联的操作模式,所以,不论是独立实体方还是函数依赖实体方,我们都推荐将

cascade值设置为none(即不发生任何级联操作),如果实体需要维护关系外键则设置

它为false(默认值),否则显式的设置它为true

4、当cascade=none时,有如下操作情况:

A、inverse=false 且 级联式API――>维护关系外键,操作当前实体和外键表

B、inverse=true 且 非级联API――>不维护关系外键,仅操作当前实体

实践经验表明:inverse=true的情况适用于独立实体,inverse=false的情况适用于

依赖实体,inverse属性只有在set标签中才存在,非set标签中没有inverse属性,默

认inverse属性值为false,表示默认情况下支持关系外键维护

注:ID生成策略为assigned的情况:

尽管数据库中可能是identity或auto_increment方式生成主键,但是你仍然可以考

虑使用assigned模式指定实体主键,但是如果ID策略是native,则程序在保存实体之

前指定的主键是无效的,它仍然根据数据来生成主键

原文链接:https://www.f2er.com/javaschema/285776.html

猜你在找的设计模式相关文章