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