Documentum DFC checkinEx 如何避免旧版本元数据回填?
结论
仅凭目前提供的代码和现象,无法确认 checkinEx 有用于关闭元数据合并的隐藏参数,也无法确认 IDfVersionPolicy 能控制属性是否继承。先不要用空格代替 NULL:这样会把属性写成字符串,日期属性也不能用空格处理。应先确认旧值是在 PWC 中重新出现,还是在签入后的对象上出现,再检查属性类型和仓库端的处理逻辑。
你的代码先绑定内容,再遍历 datamap 设置元数据,最后调用 checkinEx(false, "2.0", "0", null, null, null)。日志显示 PWC 在签入前的属性值为 NULL,但这还不能确定签入后的值是由哪一步或哪一层逻辑写入的。pwc.save() 在你的环境中会导致 NOT_CHECKEDOUT,因此不应直接把它加进现有流程来清空属性。
先确认属性值在哪一步变化
针对同一个对象和属性,分别记录以下信息:
- Checkout 后 PWC 的 object ID、属性类型,以及该属性是否为 repeating。
- 设置 NULL 后、调用
checkinEx前,PWC 中该属性的值。 checkinEx返回后,重新读取新版本对象时的属性值。
不要只看内存中的 PWC 日志。如果签入前 PWC 中的值仍为 NULL,但重新读取的新版本中出现了旧值,应重点排查签入过程或仓库端的处理。如果签入前属性已经恢复,则检查本地代码是否在之后再次写入该属性,以及内容绑定后到签入前的调用顺序。
核对属性类型和清空语义
setNull、空字符串和空格表示不同的值。日期属性不能通过写入空格设为 NULL;对于 repeating 属性,清空所有值也可能不同于将单值属性设为 NULL。请根据对象类型和属性定义,核对 DFC 对这些操作的支持和语义。除非已确认组合行为符合预期,否则不要对 repeating 属性同时调用多个清空操作。
可以先将清空逻辑缩减为只处理单个属性的最小复现:
pwc.setNull(key);
// 对 repeating 属性,先根据属性定义确认应如何清空,
// 再选择对应操作;不要把空格当作 NULL。
同时检查 datamap 是否包含所有需要清空的属性。当前循环只处理 datamap.keySet() 中的键,Map 中没有的属性不会执行 setNull。
排查签入时的其他写入来源
如果确认签入前 PWC 中的值为 NULL,但重新读取新版本后仍是旧值,请检查对象类型的属性定义、默认值或必填约束,以及当前仓库是否配置了会在保存或签入时修改属性的服务器端逻辑。这些是排查方向,不代表你的环境中一定存在这些机制。
现有信息不足以证明“隐藏参数”或 IDfVersionPolicy 能关闭属性回填。请先查阅与你使用的 DFC 版本相匹配的 API 文档,确认 checkinEx 参数和版本策略各自的职责。在找到明确依据前,不要假设存在可用的禁用开关。
建议的验证顺序
- 用一个属性、一个对象版本和一份最小 Map 复现,并记录属性类型及 repeating 状态。
- 只执行一次清空操作,签入后重新读取新版本并比较属性值。
- 分别在不同对象或测试环境中进行实验,对比是否由对象类型配置或仓库端逻辑触发。
- 如果最小复现仍能稳定复现,请整理 DFC 版本、对象类型、属性定义、调用顺序和前后读取结果,再核对对应版本的 DFC 文档,或提交给 Documentum 支持渠道。
确认属性类型和签入后的值之前,不建议用空格、虚构日期或其他占位内容处理 NULL 问题。
备注:内容仅供参考。
