PersistenceManageFactory
JDO中一个很重要的类除了JDOHelper助手类之外就是这个PersistenceManagerFactory了,它是进行JDO开发初始化配置和获得PersistenceManager的工厂类,写这篇文章的目的是为了详细介绍这个类的内部方法和它们的用途以便大家在使用JDO是作为参考。
上图显示了PersistenceManagerFactory的主要属性和方法。PersistenceManagerFactory负责为应用程序创建PersistenceManager对象实例,它可以设置数据库连接的相关参数并可以设置创建的PersistenceManager对象的缺省设置。你也可以使用它来规划JDO厂商的实现,根据不同厂商提供的附加支持实现应用的优化。
下面我将对PersistenceManagerFactory进行详细的介绍:
1、 如何获得PersistenceManagerFactory
多数JDO厂商都提供构造PersistenceManagerFactory的方法, 每个厂商之间也许存在着不同,但一般情况下还是推荐使用标准的JDOHelper的getPersistenceManagerFactory方法,这个方法的Properties参数可以设置这个工厂对象的属性,一旦获得这个工厂对象,那么他的所有属性会被“冻结”,也就是说你不能再修改这个对象的属性,如果你试图这样做的话,会抛出一个JDOUserException异常,这是因为这个工厂对象可能是来自一个对象池或着它还要被共享供其他的应用使用。
JDO要求具体的PersistenceManagerFactory类必须实现Serializable接口,这样就可以把它放到一个文件或是JNDI树中以便随时使用。
2、 PersistenceManagerFactory的属性
PersistenceManagerFactory中大部分方法是标准的JavaBean风格的getter和setter方法他们对应相应的属性字段(如上图所示)。这些属性可以分为两个范畴Connection的配置以及PersistenceManager和Transaction的缺省选项
1) Connection配置
所谓Connection就是数据库连接,我通过一段例子代码来讲述它的设置过程。
下面这段代码告诉JDOHelper如何连接到数据库和数据库的登录用户名
public String getConnectionUserName ();
public void setConnectionUserName (String user);
props.setProperty ("javax.jdo.option.ConnectionUserName", user);
设置连接数据库的密码
public String getConnectionPassword ();
public void setConnectionPassword (String pass);
props.setProperty ("javax.jdo.option.ConnectionPassword", pass);
设置数据库连接的信息
public String getConnectionURL ();
public void setConnectionURL (String url);
props.setProperty ("javax.jdo.option.ConnectionURL", url);
设置数据库的驱动
public String getConnectionFactoryName ();
public void setConnectionFactoryName (String name);
props.setProperty ("javax.jdo.option.ConnectionFactoryName", name);
通过JNDI查找连接工厂,你可以使用连接池通过DataSource获得这个连接工厂
public Object getConnectionFactory ();
public void setConnectionFactory (Object factory);
//用于获得本地连接的方法
public Object getConnectionFactory2 ();
public void setConnectionFactory2 (Object factory);
2) PersistenceManager和Transaction的缺省选项
下面的方法将设置由PersistenceManagerFactory创建的PersistenceMangere和相关的Transaction对象的缺省属性。有些JDO实现厂商也许没有实现全部这些属性,当你设置一个没有被支持的属性的时候会抛出一个JDOUnsupportedOptionException异常。
public boolean getMultithreaded ();
public void setMultithreaded (boolean multithreaded);
props.setProperty ("javax.jdo.option.Multithreaded", multithreaded);
上面的值如果被设置为true,代表PersistenceManger对象和由这个对象控制的持久化对象可以同时被多个线程访问,如果被设置为false,一些JDO实现可以通过避免同步来优化执行。
public boolean getOptimistic ();
public void setOptimistic (boolean optimistic);
props.setProperty ("javax.jdo.option.Optimistic", optimistic);
上面的方法缺省为true,代表使用优化处理,有关优化处理将在TransactionType一节中讨论。
public boolean getRetainValues ();
public void setRetainValues (boolean retain);
props.setProperty ("javax.jdo.option.RetainValues", retain);
如果上面的值设置为true,代表当数据被提交到数据库之后,持久化对象的字段值仍然保留,否则就清除字段的值。
public boolean getRestoreValues ();
public void setRestoreValues (boolean restore);
props.setProperty ("javax.jdo.option.RestoreValues", restore);
上面的方法用于控制持久化对象的行为和字段的回滚。
public boolean getNontransactionalRead ();
public void setNontransactionalRead (boolean read);
props.setProperty ("javax.jdo.option.NontransactionalRead", read);
这些方法定义了你是否能够通过Transaction读取持久对象的状态。如果被设置为false,那么你通过外部的Transaction来对持久化对象执行查询就会抛出一个JDOUserException异常。
public boolean getNontransactionalWrite ();
public void setNontransactionalWrite (boolean write);
props.setProperty ("javax.jdo.option.NontransactionalWrite", write);
这些方法定义了你是否可以通过外部的Transaction对持久化对象进行写的操作,如果是false,那么你通过外部的Transaction来对持久化对象执行更新操作时就会抛出一个JDOUserException异常。
public boolean getIgnoreCache ();
public void setIgnoreCache (boolean ignore);
props.setProperty ("javax.jdo.option.IgnoreCache", ignore);
上面的方法设置当在一个持久化对象上执行”测试查询”时,是否在当前的处理过程中更改持久化对象的状态,true标识忽略更改。如果设置为false那么在执行查询的时候会立即将结果更新的到数据库。
3、 如何获得PersistenceManager
获得PersistenceManager可以调用下面的方法
public PersistenceManager getPersistenceManager ();
public PersistenceManager getPersistenceManager (String user, String pass);
两个方法都可以获得PersistenceManage,第一个方法通过PersistenceManagerFactory的setConnectionUserName和setConnectionPassword方法来设置数据库的连接信息,第二个通过传入的参数来设置数据库连接的用户名和密码。
4、 属性和支持的选项设置
public Properties getProperties ();
public Collection supportedOptions ();
getProperties方法可以获得一个Properites对象,他包含的特定的JDO厂商信息和版本信息,其中包含两个键:
VendorName:JDO厂商的名称
VersionNumber:JDO实现的版本号
getProperties方法可以获得一组包含字符串(String)的集合,它包含JDO实现实现的选项:
l javax.jdo.option.TransientTransactional
l javax.jdo.option.NontransactionalRead
l javax.jdo.option.NontransactionalWrite
l javax.jdo.option.RetainValues
l javax.jdo.option.Optimistic
l javax.jdo.option.ApplicationIdentity
l javax.jdo.option.DatastoreIdentity
l javax.jdo.option.NonDurableIdentity
l javax.jdo.option.ArrayList
l javax.jdo.option.HashMap
l javax.jdo.option.Hashtable
l javax.jdo.option.LinkedList
l javax.jdo.option.TreeMap
l javax.jdo.option.TreeSet
l javax.jdo.option.Vector
l javax.jdo.option.Map
l javax.jdo.option.List
l javax.jdo.option.Array
l javax.jdo.option.NullCollection
l javax.jdo.option.ChangeApplicationIdentity
l javax.jdo.query.JDOQL