第八章 PersistenceManager
上图概括了PersistenceManager 接口最常用的方法和属性。参考Javadoc了解更完整的信息。类JAVA
BEAN风格的getter和setter方法在字段声明时给出。入参为....的方法表示重载函数。
PersistenceManager 是应用程序和JDO运行时结合的主要接口。每个PersistenceManager 管理一个持
久事务对象的缓存,并关联一个单一的事务。
按照功能,PersistenceManager 的方法可以如下分类:
1)关联用户对象
2)属性配置
3)关联事务
4)能持久生存期管理
5)JDO标识管理
6)查询工厂
7)扩展工厂
8)关闭
8。1 关联用户对象
PersistenceManager的UserObject 属性允许你将任意一个对象和一个PersistenceManager关联。这
个对象不能是JDO实现品使用的对象。
8.2. 属性配置
PersistenceManager 包括两个配置属性的getter和setter方法。分别是Multithreaded 和
IgnoreCache. 这些属性在PersistenceManagerFactory 设置一节里已经详细讨论过了。
8。3 关联事务
PersistenceManager 和事务实例有着一对一的关系。事实上,许多厂商用单一的类来实现
PersistenceManager 和Transaction 接口。如果你的程序要求并发事务,你必须使用多重的
PersistenceManagers.
你可以使用currentTransaction方法来取得当前PersistenceManager 所关联的事务。
8。4 能持久生存期管理
PersistenceManagers 执行许多影响能持久类生存期实例状态的动作。这点通过提供多个函数来表现。例
如,可以将某个能持久对象作为参数,例如makePersistent方法, 也可以将整个能持久类的数组或集合作为
参数。例如makePersistentAll方法
1)由暂时性转化为新持久状态。这个行为只能在活动事务的上下文环境中使用。事务提交之后,新的持久
实例会插入到数据库。
2)这个行为使持久实例向暂时性状态转化。这个实例马上失去关联的PersistenceManager 和JDO标识。
但在数据库中的记录不会被修改。
这个行为只能在clean对象上执行。如果在dirty对象执行,会抛出JDOUserException
3)用这个方法使暂时性对象变为transient-transactional状态,或者持久非事务的对象进入当前事务
。在第二种情况下,这个行为必须在活动事务中执行。
4)收回对象意味着告诉PersistenceManager你不再使用这个对象。对象的状态会变为hollow且
PersistenceManager 释放所有对该对象的强引用,允许它被垃圾回收。
调用evictAll 方法表示收回所有在PersistenceManager缓存中处于persistent-clean状态的对象
5)使用refresh 行为确保对象的持久状态和数据库中的值同步。这个行为的用意是避免长时间运行的优化
事务发生数据陈旧的危险。
refreshAll 方法针对所有缓存中的事务性对象。如果没有活动的事务,这个方法没有意义。
6)某个持久对象从数据库中取出所有持久字段,用这个方法取得该对象。用这个行为确保在状态转为暂时
性之前所有实例的字段完全被装载。注意,这个行为并不是递归的。假如对象A和B有关系,那么以A作为参数
调用retrieve 方法会装载B,会不必要地以数据库中的值填充B的字段。
8。5 生存期例子
8。6 JDO标识管理
每个PersistenceManager都在缓存中管理持久对象的JDO标识。方法如下:
1)返回能持久类的JDO标识类
2)用JDO标识对象的toString方法返回的字符串重新创建JDO标识对象。假设一个能持久类和它的JDO标识
字符串,这个方法使用上述的getObjectById方法构造一个JDO标识对象,这个对象首先创建一个字符串,然
后根据这个字符串取得持久类对象。
3)返回PersistenceManager 管理的能持久类的JDO标识
4)返回JDO标识对象的相应持久类实例。如果实例已经缓存,会返回缓存里的版本。否则会创建一个新的实
例。是否从数据库中装载数据则不一定。
如果方法的参数为true,当前JDO标识在数据库中的记录不存在,那么JDO会抛出
JDODataStoreException。否则,JDO会返回一个未验证是否被其他持久管理者删除的已缓存的实例。一些
JDO实现品在没有缓存对象存在时会返回一个hollow实例。如果你访问这个对象的持久字段不会抛出异常。
8。7 Extent工厂
扩展是所有能持久类的能持久实例的逻辑体现,包括子类在内。
使用 PersistenceManager 的getExtent 方法可以取得扩展。有两个参数:扩展 包含的对象的类,和
一个提示是否包括子类的布尔类型的参数
假如能持久类在元数据里的requires-extent属性设置为false,那么你不能得到该类的扩展。
8。8 查询工厂
查询对象用来查找符合某些条件的持久化对象。你可以通过PersistenceManager的newQuery得到查询实
例。参考查询章节和Javadoc可以获得更详细信息。
8.9 关闭
当不再需要PersistenceManager的时候,你应该调用它的close方法。