OCM是Object Content Mapping的缩写,同Hibenrate的ORM功能类似,Jackrabbit提供了OCM的功能,只不过所映射的对象不是数据库表格,而是jcr节点,可以让我们以操作对象的方式来更新Jackrabbit存储结构。
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文件)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jackrabbit-ocm PUBLIC "-//The Apache Software Foundation//DTD
Repository//EN" "http://jackrabbit.apache.org/dtd/jackrabbit-ocm-1.5.dtd">
<jackrabbit-ocm>
<class-descriptor className=“model.PressRelease”>
<field-descriptor...../> <!--原子字段类型-->
<bean-descriptor...../> <!--Bean字段类型-->
<collection-descriptor...../> <!-集合字段类型-->
</class-descriptor>
</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声明如下:
<!ELEMENT field-descriptor EMPTY>
<!ATTLIST field-descriptor
fieldName CDATA #REQUIRED
jcrName CDATA #IMPLIED
id (true | false) "false"
path (true | false) "false"
uuid (true | false) "false"
converter CDATA #IMPLIED
jcrDefaultValue CDATA #IMPLIED
jcrValueConstraints CDATA #IMPLIED
jcrType (String | Date | Long | Doube | Boolean | Binary) #IMPLIED
jcrAutoCreated (true | false) "false"
jcrMandatory (true | false) "false"
jcrOnParentVersion (COPY | VERSION | INITIALIZE | COMPUTE | IGNORE | ABORT) "COPY"
jcrProtected (true | false) "false"
jcrMultiple (true | false) "false"
>
标签属性描述如下:
fieldName:所映射实体类的字段名称
jcrName:节点属性名
path:该字段属性是否为节点的存储路径
uuid:该字段属性是否为节点的唯一标识
converter:字段类型转换器,当实体类的字段属性与JCR节点的属性类型不一致时,可通过converter来完成彼此之间的相互转换
jcrDefaultValue:属性默认值
jcrValueConstraints:属性值约束
jcrType:节点属性类型,支持String , Date , Long ,
Doube , Boolean , Binary
jcrAutoCreated:该属性是否自动创建
jcrMandatory:该属性是否必须存在
jcrProtected:属性是否不可修改
jcrMultiple:属性是否为多值域(multiple value)
Bean字段类型
DTD描述如下:
<!ELEMENT bean-descriptor EMPTY>
<!ATTLIST bean-descriptor
fieldName CDATA #REQUIRED
jcrName CDATA #IMPLIED
proxy (true | false) "false"
autoRetrieve (true|false) "true"
autoUpdate (true|false) "true"
autoInsert (true|false) "true"
converter CDATA #IMPLIED
jcrType CDATA #IMPLIED
jcrAutoCreated (true | false) "false"
jcrMandatory (true | false) "false"
jcrOnParentVersion (COPY | VERSION | INITIALIZE | COMPUTE | IGNORE | ABORT) "COPY"
jcrProtected (true | false) "false"
jcrSameNameSiblings (true | false) "false"
>
标签属性描述如下:
fieldName:所映射实体类的字段名称
jcrName:节点属性名
proxy:该属性是否延迟加载
autoRetrieve:是否级联查询
autoUpdate:是否级联更新
autoInsert:是否级联新增
converter:类型转换器,jackrabbit OCM框架对外提供了4种类型的转换器,以下内容中会有详细介绍。
jcrType:节点类型,默认为nt:unstructured
jcrAutoCreated:是否自动创建
jcrMandatory:是否必须存在
jcrProtected:是否不可修改
jcrSameNameSiblings:是否允许含有同名的兄弟节点
集合字段类型
DTD声明如下:
<!ELEMENT collection-descriptor EMPTY>
<!ATTLIST collection-descriptor
fieldName CDATA #REQUIRED
jcrName CDATA #IMPLIED
proxy (true | false) "false"
autoRetrieve (true|false) "true"
autoUpdate (true|false) "true"
autoInsert (true|false) "true"
elementClassName CDATA #IMPLIED
collectionClassName CDATA #IMPLIED
collectionConverter CDATA #IMPLIED
jcrElementName CDATA #IMPLIED
jcrType CDATA #IMPLIED
jcrAutoCreated (true | false) "false"
jcrMandatory (true | false) "false"
jcrOnParentVersion (COPY | VERSION | INITIALIZE | COMPUTE | IGNORE | ABORT) "COPY"
jcrProtected (true | false) "false"
jcrSameNameSiblings (true | false) "false"
>
标签属性描述如下:
fieldName:所映射实体类的字段名称
jcrName:节点属性名
proxy:该属性是否延迟加载
autoRetrieve:是否级联查询
autoUpdate:是否级联更新
autoInsert:是否级联新增
elementClassName:集合中元素的类名称
collectionClassName:集合对象类名称
collectionConverter:类型转换器,jackrabbitOCM对外提供了8种集合类型转换器,在下面会有详细的介绍。
jcrElementName:元素节点名称
jcrType:元素节点类型
jcrAutoCreated:是否自动创建
jcrMandatory:是否必须存在
jcrProtected:是否不可修改
jcrSameNameSiblings:是否允许含有同名的兄弟节点