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 TypeJcr Type
StringSTRING
Boolean, booleanBOOLEAN
Double, doubleDOUBLE
Integer, intDOUBLE
Long, longLONG
byte\[\](\.html)BINARY
java.io.InputStreamBINARY
java.util.CalendarLONG (corresponding to Calendar.getTimeInMillis()
java.sql.TimestampLONG (corresponding to Timestamp.getTime()
java.util.DateLONG (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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值