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

时间:2012-11-30 07:05:45

标签: java jackrabbit

我想使用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

我怎么能做到这一点? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果你看一下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();