如何使用 ObjectContentManager 在节点下添加节点?

Posted

技术标签:

【中文标题】如何使用 ObjectContentManager 在节点下添加节点?【英文标题】:How i can add a node under a node using ObjectContentManager? 【发布时间】:2012-11-18 09:31:25 【问题描述】:

我想使用 ObjectContentManager 在一个节点下添加一个节点。

我可以使用 ObjectContentManager 添加单个节点,使用

Pojo1 p1 = new Pojo1 ();
p1 .setPath("/p1");
p1 .setName("p_3");
p1 .insert(p1);
ocm.save();

现在我想在这个节点下添加另一个 Pojo2 类的节点。 我写了一个代码,但它给了我例外。

Pojo2 p2 = new Pojo2 ();
p2.setPath("/p1/p2");
p2.setName("p_3");
p2.insert(p2);
ocm.save();

但这给了我一个例外。

org.apache.jackrabbit.ocm.exception.ObjectContentManagerException: Cannot create new node of type nt:pojo1 from mapped class class com.sapient.Pojo1; nested exception is javax.jcr.nodetype.ConstraintViolationException: No child node definition for p2 found in node /p1

我怎样才能做到这一点? 提前致谢。

【问题讨论】:

当我阅读tutorial on ObjectContentManager 时,您设置了一个带有 XML 或 Java 注释的映射描述符,以指定您的 pojo 是如何被持久化的。请将映射描述符信息添加到您的问题中。 【参考方案1】:

如果您查看 OCM 测试类,有一个很好的示例说明如何配置: A.java

@Node(jcrMixinTypes="mix:lockable" )
public class A

@Field(path=true) private String path;
@Field private String a1;
@Field private String a2;
@Bean(jcrType="nt:unstructured", jcrOnParentVersion="IGNORE") private B b;

Bean Annotation 用于指示您将对象持久化为另一个节点而不是属性。

这是将B对象添加到A对象AnnotationBeanDescriptorTest.java的测试代码

ObjectContentManager ocm = getObjectContentManager();
// ------------------------------------------------------------------------
// Create a main object (a) with a null attribute (A.b)
// ------------------------------------------------------------------------
A a = new A();
a.setPath("/test");
a.setA1("a1");
ocm.insert(a);
ocm.save();

// ------------------------------------------------------------------------
// Retrieve
// ------------------------------------------------------------------------
a = (A) ocm.getObject("/test");
assertNotNull("Object is null", a);
assertNull("attribute is not null", a.getB());

B b = new B();
b.setB1("b1");
b.setB2("b2");
a.setB(b);

ocm.update(a);
ocm.save();

【讨论】:

以上是关于如何使用 ObjectContentManager 在节点下添加节点?的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?