天天看点

OCM---Object Content Manager

  • 定义: Jackrabbit OCM是一个框架,用于在JCR存储库中持久化java对象(pojo),包括关联、继承、多态性、组合和java集合框架。它还提供了版本支持、对象锁定和使用基于java的标准以及JCR查询语言来表达查询等功能。OCM框架中的主要组件是ObjectContentManager。它将对象图转换为JCR节点和属性,反之亦然。ObjectContentManager总是与JCR会话相关联。它用于从JCR内容存储库检索、创建、更新和删除对象。通常每个用户会话有一个ObjectContentManager。
  • Java 对象如何持久化到JCR 仓库: 

       在所有情况下,持久对象(pojo)都映射到JCR节点,其字段根据其类型映射到子节点或属性。

       有三种“字段类型”:

       1.原子类型字段

              对应JAVA得基本数据类型和基本数据类型对应的引用类型(String、Long、Double、…),详细参考下表:

Java Type Jcr Type
String STRING
Boolean, boolean BOOLEAN
Double, double DOUBLE
Integer, int DOUBLE
Long, long LONG
byte\[\](\.html) BINARY
java.io.InputStream BINARY
java.util.Calendar LONG (corresponding to Calendar.getTimeInMillis()
java.sql.Timestamp LONG (corresponding to Timestamp.getTime()
java.util.Date LONG (corresponding to java.util.Date.getTime()

       这些字段被映射到JCR属性。 

       2.Bean字段

             一个类可以包含一个属性与另一个bean的关联。在本例中,字段是一个自定义对象。这些字段被映射到JCR子节点或引用的节点。

       3.集合类型字段

              一个类可以包含一个属性与一组bean(或映射)相关联。这些字段被映射到JCR子节点集合或引用节点集合中。还可以将java集合映射到multivalue(多值)属性。

映射描述符还包含关于继承、接口映射策略、延迟加载、自定义转换器、缓存策略等方面的信息

  • 工作原理:

        ObjectContentManage为每个持久对象(pojo)使用适当的映射策略。映射描述符包含每个持久类的一个类描述符。每个类描述符都包含对应类属性的相关信息。

从实现的角度来看,映射描述符是注入ObjectContentManager的java对象(请参阅接口org.apache.jackrabbit.ocm.mapper.Mapper)。

目前,有两种不同的映射描述符实现:

  1. 注解方式:为了向ObjectContentManager提供关于其映射策略的所有必要信息,每个持久对象都要被注释(请参阅org.apache.jackrabbit.ocm.mapper.impl类)。
  2. XML方式配置:类描述符定义在ObjectContentManager实例化时使用的一个或多个XML配置文件中(参见org.apache.jackrabbit.ocm.mapper.impl类)。

对于业务开发人员,不需要知道ObjectContentManager如何使用类描述符。他只能在带注释的类或XML文件之间做出选择。

注解方式:

// 1. Instantiate a JCR session

Repository repository = ...;

Session session = repository.login(...);


// 2. Register the different persistent classes

List classes = new ArrayList();

classes.add(MyContent.class); // Call this method for each persistent class


// 3. Instantiate the object content manager

Mapper mapper = new AnnotationMapperImpl(classes);

ObjectContentManager ocm = new ObjectContentManagerImpl(session, mapper);


初始化例子:

private static ObjectContentManager ocm;


@BeforeClass

public static void init() throws Exception {

    Repository repository = JcrUtils.getRepository();

    SimpleCredentials cred = new SimpleCredentials("admin", "admin".toCharArray());

    Session session = repository.login(cred);

    List<Class> classes = new ArrayList<>();

    classes.add(User.class);

    Mapper mapper = new AnnotationMapperImpl(classes);

    ocm = new ObjectContentManagerImpl(session, mapper);

}
           

xml方式:

// 1. Instantiate a JCR session

Repository repository = ...;

Session session = repository.login(...);


// 2. Specify the different mapping files

String[] files = {

      "./src/test-config/jcrmapping.xml",

      "./src/test-config/jcrmapping-atomic.xml",

      "./src/test-config/jcrmapping-beandescriptor.xml"

  };


// 3. Instantiate the object content manager

ObjectContentManager ocm = new ObjectContentManagerImpl(session, files);
           

继续阅读