0

刚开始使用 ModeShape,我有一个问题,是否可以更改 nodeType 定义(通过:nodeTypeMgr.registerNodeTypes(File, true))?

假设我向 noteType 添加了一个字段,我注意到即使在执行上述方法调用之后,在现有节点上调用 setProperty()(在旧的 nodeType 定义到位时仍然存在)会导致 ConstraintViolationException。

如果行为是设计使然,您是否会删除该节点并再次重新持久化以修复它?或者是否有将节点“更新”到新定义的咒语?

我将 ModeShape 3.1.0.Final 与 JBossAS 7.1.1.Final 一起使用。

4

1 回答 1

2

ModeShape 确实允许您更改/更新现有节点类型,这确实可能使现有内容在进行进一步更改时“无效”。这是JSR-283规范在很大程度上留给实现的一个领域。例如,第 19.2.4.1 节“更新节点类型”这样说:

支持节点类型管理的存储库可以支持对已用作现有节点类型的节点类型进行更新。任何此类能力的范围取决于实现。例如,一些实现可能只允许不使现有内容无效的更改,而其他实现可能允许更大的更改。如何解决任何导致的不兼容性也取决于实现。

ModeShape 确实实现了更宽松的更改,因此我们建议在更新节点类型时使用良好的实践和程序。如果您知道要向节点类型添加强制属性定义或子节点定义,请在执行此操作之前考虑其含义并确保更新内容(在更改节点类型之前或之后,具体取决于节点类型可能允许剩余属性或剩余子节点)。

如果您的节点类型没有剩余属性定义和/或子节点定义,那么在多个步骤中实现更改可能是有意义的:

  1. 首先用非强制性(例如,可选)属性定义和/或子节点定义注册节点类型。
  2. 更改使用节点类型的任何现有内容并添加新属性和/或子节点,使用导航或查询来查找需要更改的节点。
  3. 使用相同的属性定义和/或子节点定义注册节点类型,现在是mandatory.

或者,如果它在您的存储库中有意义,则将属性定义添加为新的 mixin。注册 mixin 后,您可以开始在新内容上使用它,您可以返回并将 mixin 添加到要添加新属性(或属性)的现有节点。

我们还建议您在首次创建节点类型时考虑您的节点类型可能会如何演变。进化只是影响您设计的几个方面之一。

更新节点类型的挑战在于需要做什么(以及最好的方法)在很大程度上取决于节点类型的细节。这就是为什么我们选择将这个过程的大部分内容留给您。另一种选择是 ModeShape 对节点类型允许的更新类型有更多限制,这将阻止和/或限制大量节点类型更新。

于 2013-02-12T13:56:21.660 回答