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,则程序在保存实体之

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


你可能感兴趣的:(数据库,object,程序,false,assigned)