JDO技术分析及如何进入企业应用的研究
对象删除
对象删除采用方法deletePersistence。示例如下:
pm.currentTransaction().begin();
Object obj =
pm.newObjectIdInstance
(Book.class,isbn);
Book book =
(Book)pm.getObjectById(obj,true);
pm.deletePersistence(book);
pm.currentTransaction().commit();
获得PersistenceManager实例
上述的所有操作与需要PersistenceManager实例,它可以在两种环境方法下获得:非受管环境和受管环境。
非受管环境
非受管环境是多指两层开发模式,应用程序直接获得资源对象,进行业务操作。一般事务管理、安全管理或资源管理都需要应用程序自行维护。
Properties properties =
new Properties();
properties.put(“javax.jdo.
PersistenceManagerFactoryClass”,
“com.xxx.jdo.xxxPMFClass”);
properties.put(“javax.jdo.
option.ConnectionURL”, “xxx”);
properties.put(“javax.jdo.
option.ConnectionUserName”, “xxx”);
properties.put(“javax.jdo.
option.ConnectionPassword”, “xxx”);
PersistenceManagerFactory pmf =
JDOHelper.getPersistence
ManagerFactory(properties);
PersistenceManager pm =
pmf.getPersistenceManager();
与JDBC获取类似。
受管环境
受管环境一般是多层开发模式,尤其是处于J2EE应用环境中,程序通过容器获得资源对象,进行业务操作,由于在容器环境下,事务、安全及资源管理都由容器进行统一集中管理,从而简化了代码结构。
以下是EJB(EntityBean、SessionBean、MessageDrivenBean)中的setXXXContext中的代码示例。
private PersistenceManagerFactory pmf;
public void setXXXContext
(XXXContext context)
{
try{
InitialContext ctx =
new InitialContext();
Object obj = ctx.lookup
(“java:compenvjdofactory”);
pmf = (PersistenceManagerFactory)
PortableRemoteObject.narrow
(o,PersistenceManagerFactory.class);
}catch(NamingException e)
{
throw new Exception(e);
}
}
PMF是如何绑定到J2EE环境下的JNDI上,有兴趣可参考JCA相关的技术文档。
事务管理
事务管理及使用,主要有以下三种情形。
使用JDO事务的Bean管理情形
一般在非J2EE环境下,使用该事务管理模式。
PersistenceManager pm =
pmf.getPersistenceManager();
pm.currentTransaction().begin();
//do some business with jdo
pm.currentTransaction().commit();
pm.close();
使用JTA事务的Bean管理情形
一般在J2EE环境下,采用Bean管理的事务情形下,使用以下方式。
该方式可用在EJB的事务环境下。
xxxContext.getUser
Transaction().begin();
PersistenceManager pm =
pmf.getPersistenceManager();
//do some business with jdo
xxxContext.getUserTransaction().commit();
pm.close();
使用JTA事务的容器管理情形
一般在J2EE环境下,采用容器管理的事务情形下,使用如下方式。
如下是某个会话Bean的业务方法。
public void doBusiness(){
PersistenceManager pm ;
try{
pm = pmf.getPersistenceManager();
//do some business with jdo
}catch(Exception e){
xxxContext.setRollbackOnly();
System.out.println(e);
}finally{
try{
if (pm != null && !pm.isClosed())
pm.close();
}catch(Exception ex){
System.out.println(ex);
}
}
}
综上,可以得出结论,JDO的操作完全与JDBC的操作相差无几。
0
相关文章