Christophe Lombart escribió: > Did you review the first (and the only one :-( ) tutorial : > http://jackrabbit.apache.org/5-with-jackrabbit-ocm.html > http://jackrabbit.apache.org/a-simple-ocm-project-with-maven-eclipse.html > > Yes, I did. My test classes are based on (small) modifications of the classes the "5 mins with OCM" tutorial presents. > > >> However, when I try to store an entity (using ocm.insert(obj); >> ocm.save();) I get an exception stating that I cannot write at the >> repository root (/), what's going on? Thanks in advance... >> >> >> > > can you send more information ? What is the name of the exception ? please, > send us a code example. > > Sure, here you have it. I've made a GenericJcrDAO class modelled after the GenericHibernateDAO on Hibernate's book, Here you have its code: -------------------------------------------------- GenericJcrDAO.java ----------------------------------------------------- package repository; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.List; import javax.jcr.Session; import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException; import org.apache.jackrabbit.ocm.manager.ObjectContentManager; import org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl; import org.apache.jackrabbit.ocm.mapper.impl.annotation.AnnotationMapperImpl; public abstract class GenericJcrDAO { private Class clazz; protected ObjectContentManager ocm; protected Session session; @SuppressWarnings("unchecked") public GenericJcrDAO(Session session) { this.session = session; ParameterizedType pt = (ParameterizedType) getClass().getGenericSuperclass(); clazz = (Class)pt.getActualTypeArguments()[0]; List classes = new ArrayList(); classes.add(clazz); ocm = new ObjectContentManagerImpl(session, new AnnotationMapperImpl(classes)); } public void store(T entity) throws RepositoryException { try { ocm.insert(entity); ocm.save(); } catch (ObjectContentManagerException ocme) { throw new RepositoryException(ocme); } } public T retrieve(String xpath) throws RepositoryException { try { T entity = clazz.cast(ocm.getObject(xpath)); return entity; } catch (ObjectContentManagerException ocme) { throw new RepositoryException(ocme); } } public T delete(String xpath) throws RepositoryException { try { T entity = clazz.cast(ocm.getObject(xpath)); ocm.remove(entity); ocm.save(); return entity; } catch (ObjectContentManagerException ocme) { throw new RepositoryException(ocme); } } } I've made a PressReleaseDAO class to store objects of class PressRelease (the one of the "5 mins" tutorial), which is very simple (no PressRelease-specific code there yet): -------------------------------------------------- PressReleaseDAO.java ----------------------------------------------------- package repository; import javax.jcr.Session; import com.calenco.ocm.model.PressRelease; public class PressReleaseDAO extends GenericJcrDAO { public PressReleaseDAO(Session session) { super(session); } } I've also made a RepositoryManager class to encapsulate OCM repo creation/management which closely resembles the example of the "5 mins" tutorial. The JUnit test case for the store() method is: @Test public void testStore() throws Exception { PressRelease pr = new PressRelease(); pr.setTitle("Test Press Release"); pr.setPubDate(new Date()); pr.setPath("/pr1"); pr.setContent("Just a test press release"); PressReleaseDAO prdao = new PressReleaseDAO(session); prdao.store(pr); } And the exception stack trace is: repository.RepositoryException: org.apache.jackrabbit.ocm.exception.ObjectContentManagerException: Cannot persist current session changes.; nested exception is javax.jcr.AccessDeniedException: /: not allowed to modify item at repository.GenericJcrDAO.store(GenericJcrDAO.java:35) at com.calenco.jcr.RepositoryManagerTest.testStore(RepositoryManagerTest.java:94) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99) at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81) at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75) at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45) at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66) at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35) at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42) at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Caused by: org.apache.jackrabbit.ocm.exception.ObjectContentManagerException: Cannot persist current session changes.; nested exception is javax.jcr.AccessDeniedException: /: not allowed to modify item at org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl.save(ObjectContentManagerImpl.java:1076) at repository.GenericJcrDAO.store(GenericJcrDAO.java:32) ... 21 more Caused by: javax.jcr.AccessDeniedException: /: not allowed to modify item at org.apache.jackrabbit.core.ItemImpl.validateTransientItems(ItemImpl.java:486) at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1208) at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:897) at org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl.save(ObjectContentManagerImpl.java:1068) ... 22 more I hope this helps, please let me know if you need more information (Using latest JackRabbit jars available on jackrabbit.apache.org). Thanks in advance.