Hi Aaron, Yeah, lets try to put it into the OpenJPA DAO moudle first, and then think about the other way.
BTW, I didn't see you commit logs on your repo, was thinking that I will add you as a collaborator in the github's jpa work repository. Regards Jeff On Fri, Mar 5, 2010 at 4:37 AM, Aaron Anderson <aaronander...@acm.org>wrote: > Hi Jeff, > > Thanks for the response! > > For question #2, I errantly used the term class annotation instead of class > enhancement. The challenge I encountered was trying to acheive the goal of > reusing the same JPA entities across persistence providers while > also somehow addressing the differences between the class > enhancement behaviors of hibernate and OpenJPA. Hibernate utilizes a byte > code manipulator at runtime to augment the JPA entites so I had no problems > with it. OpenJPA on the other hand requires the JPA entity classes to be > enhanced with OpenJPA specific class references or there must be an OpenJPA > agent to augment the classes at runtime. Using the OpenJPA enhancer means > that there must be two separate versions of the JPA entity compiled classes: > a non-manipulated version and an OpenJPA enhanced version. I used a maven > classifer to set them appart but it would be possible to include the OpenJPA > enhanced classes in the OpenJPA DAO module. Maybe when I am done with > shuffling > around the code I can investigate to see if there is a way to enable the > OpenJPA agent at runtime programatically so it behaves more like Hibernate. > > Regards, > > Aaron > > > > ________________________________ > From: Jeff Yu <jeff.yuch...@gmail.com> > To: dev@ode.apache.org > Sent: Thu, March 4, 2010 12:22:14 AM > Subject: Re: JPA DAO refactoring. > > Hi Aaron, > > Firstly, we are very glad that you made progress on this, and interested in > contributing your effort in this area. ;) > > comments inline. > > On Thu, Mar 4, 2010 at 2:02 PM, Jeff Yu <jeff.yuch...@gmail.com> wrote: > > > Quote from Aaron's comments of JIRA. ( > > https://issues.apache.org/jira/browse/ODE-704) > > > > Hi Jeff, > > > > Thanks for the pointers on helping me get started on this task. I have > > setup a github project and created a fork of your JPA branch. I have made > > some progress with separating the JPA and hibernate code apart based on > your > > initial effort and I also have started to attempt to unify the JPA DAO > > patterns used in the DAO and bpel-store modules. I had a few questions > and I > > was hoping you could provide me some guidance on them. > > > > 1) Maven modules - To prevent module proliferation I was thinking that > the > > DAO, store, and scheduler implementations could be stored in the same > module > > per implementation. For example, > > > > ode-dao - contains new generic DAO ConnectionFactory interface(s) and the > > existing core DAOConnection interfaces > > dao-jpa - contains all the JPA entities, including dao, store, and soon > to > > be scheduler. The store and scheduler implementations would still be in > > different packages and persistence units. > > dao-hibernate - contains all the hibernate entities, including dao, > store, > > and soon to be scheduler. Includes factory implementation classes that > > implement generic interfaces in ode-dao > > dao-jpa-ojpa - contains factory implementation classes that implement > > generic interfaces in ode-dao. The factory primes the JPA environment > with > > the the openjpa specific properties > > dao-jpa-hibernate - same as dao-jpa-ojpa but for hibernate > > bpel-store - contains factory implementation classes that implement > generic > > interfaces in ode-dao and the existing store connection code. > > bpel-scheduler-simple - the same as bpel-store with new connection based > > DAO > > il-common - OdeConfigProperties updated to include new factory class > > lookups for the store and scheduler implementations > > > > What do you think of this approach? > > > > +1 to this. One comment, (just make sure. ;) ) for the ode-dao, we should > put the store, and soon to be scheduler's DAO's Interfaces into this > module. > > > > > > > 2) OpenJPA class enhancements - OpenJPA requires that the classes be > > annotated in order to be utilized unless a JavaEE container is used or > their > > runtime agent is utilized. The problem is that these class enhancements > > would interfere with a different JPA implementations and duplicating the > > entities per implementation module would lead to too much redundancy. To > > address this I took the approach of extending the dao-jpa maven pom to > > duplicate the target classes, run the enhancer on the copy, and then run > the > > maven-jar plugin again with a classifer of openjpa so that two versions > of > > the module will be stored in the maven repo. Is this a valid approach? > > > > Sorry, I didn't see these openjpa's specific annotations in the code? With > regard to the class enhancements, I was thinking that we run the enhance > commands on the dao-jpa-ojpa module, so the dao-jpa module is all about > standard JPA, no JPA's implementator's stuff. Does this approach make sense > to you? > > > > > > 3) When examining the ode 2.0 source code I found a lot of references to > > JDBC datasources and transaction managers in the DAO classes. To me the > DAO > > abstraction classes should be storage implementation agnostic. I would > like > > to refactor the connection interfaces to use the same interface and > > introduce a common DAO strategy. > > > > //new common interface > > public interface DAOConnectionFactory<C> { > > > > C getConnection(); > > > > <E> void init(OdeConfigProperties p, E envCtx); > > > > void shutdown(); > > } > > > > //Module specific DAO access implementation (dao, store, scheduler, etc) > > public interface BpelDAOConnectionFactory extends > > DAOConnectionFactory<BpelDAOConnection> { > > > > BpelDAOConnection getConnection(); > > > > > > } > > > > //Implementation specific factory that can be instantiated by the module > > using an OdeConfigProperties lookup > > public class BpelDAOConnectionFactoryJPAImpl implements > > BpelDAOConnectionFactory { > > > > public BpelDAOConnection getConnection() { > > return new BpelDAOConnectionJpaImpl(); > > } > > > > public <JDBCContext>void init(OdeConfigProperties p, JDBCContext envCtx) > > { > > > > } > > > > public void shutdown() { > > > > } > > > > } > > > > //This is a implementation specific environment context that the runtime > > the ode is executed in can pass opaquely through the DAO layer into the > > implementation. > > public class JDBCContext { > > > > DataSource getDataSource(){} > > TransactionManager getTransactionManager(){} > > > > } > > > > > > What are your thoughts on this approach? > > > > Yeah, +1, I like this idea. > > Regards > Jeff > > > > > > Regards, > > > > Aaron > > > > -- > > Cheers, > > Jeff Yu > > > > ---------------- > > blog: http://jeff.familyyu.net > > > > > > > -- > Cheers, > Jeff Yu > > ---------------- > blog: http://jeff.familyyu.net > -- Cheers, Jeff Yu ---------------- blog: http://jeff.familyyu.net