kodojdo指南第八章

类别:Java 点击:0 评论:0 推荐:

第八章 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方法。

本文地址:http://com.8s8s.com/it/it13807.htm