-
定义: 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)。
目前,有两种不同的映射描述符实现:
-
注解方式:为了向ObjectContentManager提供关于其映射策略的所有必要信息,每个持久对象都要被注释(请参阅org.apache.jackrabbit.ocm.mapper.impl类)。
-
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);