jackrabbit OCM(一)

来源:互联网 发布:网络传播概论思维导图 编辑:程序博客网 时间:2024/05/10 23:49

OCM是Object Content Mapping的缩写,同Hibenrate的ORM功能类似,Jackrabbit提供了OCM的功能,只不过所映射的对象不是数据库表格,而是jcr节点,可以让我们以操作对象的方式来更新Jackrabbit存储结构。

Jackrabbit的OCM功能目前也仍处于修订状态,并且从1.5版本之后没有纳入API文档范围之内。针对JCR2.0的版本实现可以在这个网址进行下载
点击打开链接
 
jackrabbitOCM框架对外提供的最主要的一个类为ObjectContentManager,可通过如下代码实例化该对象:
ObjectContentManager ocm=new ObjectContentManagerImpl(session,mapper);
第一个参数为Repository的会话Session, ObjectContentManager通过它创建、管理JCR内容节点(包括节点的检索、新增、更新、删除等);
第二个参数为OCM要处理的映射描述信息
同hibenrate一样,OCM映射描述信息可通过两种方式来进行声明:
1.Annotation注解方式
*实体类注解为@Node
*原子字段类型注解为@Field,其中path=true表示该属性为节点的存储路径
*Bean字段类型注解为@Bean
*集合字段类型注解为@Collection
 
2.xml方式(类似Hibernate的hbm文件)
[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE jackrabbit-ocm PUBLIC "-//The Apache Software Foundation//DTD   
  3. Repository//EN" "http://jackrabbit.apache.org/dtd/jackrabbit-ocm-1.5.dtd">   
  4. <jackrabbit-ocm>  
  5.     <class-descriptor className=“model.PressRelease”>  
  6.         <field-descriptor...../> <!--原子字段类型-->  
  7.         <bean-descriptor...../> <!--Bean字段类型-->  
  8.         <collection-descriptor...../> <!-集合字段类型-->  
  9.     </class-descriptor>  
  10. </jackrabbit-ocm>  
个人推荐第二种方式,这样可针对与同一个实体类,通过编写不同的XML映射描述,来实现不同方式的映射处理(ORM或OCM)。
 
OCM支持3种字段类型(Field Type)的映射处理,分别是:
1.Atomic Fields(原子字段类型):映射到节点的Property ;
2.Bean Filed(bean字段类型):映射到节点的Property或子节点;
3.Collection Filed(集合字段类型):映射到子节点或者节点的多值域(multivalue property)
 
在做映射处理的过程中,开发人员通常要处理3方面的信息内容,分别是:
1.JCR节点类型的定义:同数据库相比,每个JCR节点相当于是一张表,而节点类型相当于是表结构的定义
2.Java实体类的编写:OCM要映射出的实体类对象
3.映射配置描述文件的编写:XML映射描述信息
这3方面信息内容的展现在结构上是一一对应的关系,改变单方的同时也要级联修改其他方
 
原子字段类型
DTD声明如下:
[html] view plaincopy
  1. <!ELEMENT field-descriptor EMPTY>  
  2. <!ATTLIST field-descriptor  
  3.     fieldName CDATA #REQUIRED  
  4.     jcrName CDATA #IMPLIED   
  5.     id (true | false) "false"  
  6.     path (true | false) "false"  
  7.     uuid (true | false) "false"  
  8.     converter CDATA #IMPLIED  
  9.     jcrDefaultValue CDATA #IMPLIED  
  10.     jcrValueConstraints CDATA #IMPLIED   
  11.     jcrType (String | Date | Long | Doube | Boolean | Binary) #IMPLIED  
  12.     jcrAutoCreated (true | false) "false"  
  13.     jcrMandatory (true | false) "false"  
  14.     jcrOnParentVersion (COPY | VERSION | INITIALIZE | COMPUTE | IGNORE | ABORT) "COPY"  
  15.     jcrProtected (true | false) "false"  
  16.     jcrMultiple (true | false) "false"  
  17. >  
标签属性描述如下:
fieldName:所映射实体类的字段名称
jcrName:节点属性名
path:该字段属性是否为节点的存储路径
uuid:该字段属性是否为节点的唯一标识
converter:字段类型转换器,当实体类的字段属性与JCR节点的属性类型不一致时,可通过converter来完成彼此之间的相互转换
jcrDefaultValue:属性默认值
jcrValueConstraints:属性值约束
jcrType:节点属性类型,支持String , Date , Long , Doube , Boolean , Binary
jcrAutoCreated:该属性是否自动创建
jcrMandatory:该属性是否必须存在
jcrProtected:属性是否不可修改
jcrMultiple:属性是否为多值域(multiple value)

Bean字段类型
DTD描述如下:
[html] view plaincopy
  1. <!ELEMENT bean-descriptor EMPTY>  
  2. <!ATTLIST bean-descriptor  
  3.     fieldName CDATA #REQUIRED  
  4.     jcrName CDATA #IMPLIED   
  5.     proxy (true | false) "false"   
  6.     autoRetrieve (true|false) "true"  
  7.     autoUpdate (true|false) "true"  
  8.     autoInsert (true|false) "true"  
  9.     converter CDATA #IMPLIED  
  10.     jcrType CDATA #IMPLIED  
  11.     jcrAutoCreated (true | false) "false"     
  12.     jcrMandatory (true | false) "false"  
  13.     jcrOnParentVersion (COPY | VERSION | INITIALIZE | COMPUTE | IGNORE | ABORT) "COPY"  
  14.     jcrProtected (true | false) "false"  
  15.     jcrSameNameSiblings (true | false) "false"           
  16. >  
标签属性描述如下:
fieldName:所映射实体类的字段名称
jcrName:节点属性名
proxy:该属性是否延迟加载
autoRetrieve:是否级联查询
autoUpdate:是否级联更新
autoInsert:是否级联新增
converter:类型转换器,jackrabbit OCM框架对外提供了4种类型的转换器,以下内容中会有详细介绍。
jcrType:节点类型,默认为nt:unstructured
jcrAutoCreated:是否自动创建
jcrMandatory:是否必须存在
jcrProtected:是否不可修改
jcrSameNameSiblings:是否允许含有同名的兄弟节点

集合字段类型
DTD声明如下:
[html] view plaincopy
  1. <!ELEMENT collection-descriptor EMPTY>  
  2. <!ATTLIST collection-descriptor  
  3.     fieldName CDATA #REQUIRED  
  4.     jcrName CDATA #IMPLIED   
  5.     proxy (true | false) "false"  
  6.     autoRetrieve (true|false) "true"  
  7.     autoUpdate (true|false) "true"  
  8.     autoInsert (true|false) "true"  
  9.     elementClassName CDATA #IMPLIED  
  10.     collectionClassName CDATA #IMPLIED  
  11.     collectionConverter CDATA #IMPLIED  
  12.     jcrElementName CDATA #IMPLIED  
  13.     jcrType CDATA #IMPLIED  
  14.     jcrAutoCreated (true | false) "false"     
  15.     jcrMandatory (true | false) "false"  
  16.     jcrOnParentVersion (COPY | VERSION | INITIALIZE | COMPUTE | IGNORE | ABORT) "COPY"  
  17.     jcrProtected (true | false) "false"  
  18.     jcrSameNameSiblings (true | false) "false"  
  19. >  
标签属性描述如下:
fieldName:所映射实体类的字段名称
jcrName:节点属性名
proxy:该属性是否延迟加载
autoRetrieve:是否级联查询
autoUpdate:是否级联更新
autoInsert:是否级联新增
elementClassName:集合中元素的类名称
collectionClassName:集合对象类名称
collectionConverter:类型转换器,jackrabbitOCM对外提供了8种集合类型转换器,在下面会有详细的介绍。
jcrElementName:元素节点名称
jcrType:元素节点类型
jcrAutoCreated:是否自动创建
jcrMandatory:是否必须存在
jcrProtected:是否不可修改
jcrSameNameSiblings:是否允许含有同名的兄弟节点