更新nodeType定义并修改现有数据

时间:2013-02-12 04:54:51

标签: modeshape

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

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

如果行为是设计的,您是否会删除该节点并再次重新保留它以修复它?或者是否有一个“更新”节点到新定义的咒语?

我正在使用ModeShape 3.1.0.Final和JBossAS 7.1.1.Final。

1 个答案:

答案 0 :(得分:2)

ModeShape允许您更改/更新现有节点类型,这可能确实使得现有内容在进行进一步更改时“无效”。这是JSR-283规范为实现留下了很多东西的一个领域。例如,第19.2.4.1节“更新节点类型”说明了这一点:

  

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

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

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

  1. 首先使用非强制(例如,可选)属性定义和/或子节点定义注册节点类型。
  2. 使用导航或查询更改使用节点类型的任何现有内容并添加新属性和/或子节点,以查找需要更改的节点。
  3. 使用相同的属性定义和/或子节点定义({1}}注册节点类型。
  4. 或者,如果在您的存储库中有意义,请将属性定义添加为新的mixin。注册mixin后,您可以开始在新内容上使用它,然后您可以返回并将mixin添加到要添加新属性(或属性)的现有节点。

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

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