You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-dev@db.apache.org by Matthew Adams <ma...@xcalia.com> on 2007/02/23 22:36:36 UTC
[DISCUSS] Convenient PC method introductions
This was discussed on the Feb 23 JDO conf call. Please review and
discuss.
Overview:
Grails is a promising new framework for lightweight, Rails-style
development. It uses GORM, which introduces several nice features to
persistent objects, but it is hard-coded against Hibernate and won't
currently run outside of the Grails application framework.
Motivation:
* Frameworks like GORM are currently specific to Hibernate only, and
they can't (to my knowledge) be extracted from Grails
* Spring provides some conveniences via JDOTemplate that would be nice
in general.
Spring has several convenient methods offered via JDOTemplate that can
be offered in an intuitive way in a manner similar to GORM.
With the introduction of JDO 2.1's PMF.getPersistenceManagerProxy(),
there are new possibilites to introduce to persistent classes convenient
static & instance methods without any work on the developer's part.
Proposed solution:
* Introduce convenient static & instance methods on persistent classes
* Identify a way to make PMF available across application
* Leverage pmf.getPersistenceManagerProxy() in introduced methods
Details:
There are some catchy (the author would say "hilarious") names for
Groovy persistence integration, as that was my original thought:
Gentities
Grentities
Perstroovy
Gersistence
Groovistence
Proovy
Proovy Gersistence
GDO: Groovy Data Objects == Groovy + JDO
GPA: Groovy Persistence API == Groovy + JPA
["GORM" is currently "Grails ORM" == Groovy + Hibernate within Grails
(should have been Ghibe, Ghibernate, Gribe or Gribernate to be more
accurate)]
Introducing via AOP is another possibility, but they're not as good as
the stuff above:
Paop (pronouned "pow-p": Persistence with AOP)
Aspersistence (kind of like "aspirin")
Aspectistance
Aspentities
AOE (pronouned "ow": Aspect-oriented Entities)
Jadaop (pronouned "jah dow-p": JDO & AOP)
Enough with the catchy names.
* Need some way to make PMF available to application, like Grails does
with GORM
* InheritableThreadLocal holding a map of PMF by name
(Map<String,PersistenceManagerFactory>)?
* PMF Proxy? JDOHelper.getPersistenceManagerFactoryProxy(???) ?
* Craig says this is not very hard -- placeholder for this
discussion is "JDO.getApplicationPMF()"
* Leverage pmf.getPersistenceManagerProxy() in order to enable:
Static methods that can be introduced:
// Foo is a persistence-capable class, btw.
// Groovy syntax here, btw -- not sure if it's totally correct
/** static method to return an instance of the class gotten by id */
get { id ->
JDO.getApplicationPMF().getPersistenceManagerProxy().getObjectById(getCl
ass(), id)
}
/** static method to count the number of instances of the class */
count() {
PersistenceManager pm =
JDO.getApplicationPMF().getPersistenceManagerProxy()
Query q = pm.newQuery(getClass(), "count(this)")
q.execute()
}
...
instance method introduction
getId() { JDOHelper.getObjectId(this) }
save() {
JDO.getApplicationPMF().getPersistenceManagerProxy().makePersistent(this
) }
delete() {
JDO.getApplicationPMF().getPersistenceManagerProxy().deletePersistent(th
is) }
detachCopy() {
JDO.getApplicationPMF().getPersistenceManagerProxy().detachCopy(this) }
...
We can support JPA & JDO pretty easily if we can get either an EMF or
PMF like Something.getPersistenceFactory() that returns Object:
count() {
Object factory = Something.getPersistenceFactory(); // returns
either EMF or PMF
if (factory instanceof PersistenceManagerFactory) {
PersistenceManager pm = ((PersistenceManagerFactory)
factory).getPersistenceManagerProxy()
Query q = pm.newQuery(getClass(), "count(this)")
return q.execute()
}
else if (factory instanceof EntityManagerFactory) {
EntityManager em = ((EntityManagerFactory)
factory).getEntityManager() // the "right" one?
Query q = em.createQuery("SELECT count(x) from " +
this.getClass().getName() + " x")
return q.getSingleResult()
}
else {
throw new YouAreTooAdvancedForMeException(...);
}
}
Matthew T. Adams
Senior Consultant & Product Marketing Director
Xcalia, Inc.
matthew.adams@xcalia.com
+1 206 331 3833 Office
+1 253 732 1051 Mobile
+1 815 331 0952 Fax
http://www.xcalia.com <http://www.xcalia.com/>
745 Emerson St.
Palo Alto, CA 94301
Xcalia provides dynamic integration software for agile enterprises to
easily create transactional composite applications. Our unique
intermediation approach enables unified, real-time access to
heterogenous data and services. Intermediation is adaptive and
configurable so application changes can be made quickly and cost
effectively without impacting the underlying systems or infrastructure.