Yep, thats definitiey a possibility as well. We have moved to builder pattern in lots of other places.
On 07/17/2012 05:17 PM, Gunnar Morling wrote: > Hi, > > Maybe you could also use a builder for this: > > AbstractEntityManagerImpl = AbstractEntityManagerBuilder > .forDelegate(entityManagerFactory) > .contextType(...) > .transactionType(...) > .property("foo", bar) > .property("baz", qux) > .build(); > > That way new attributes required for creating an AEMI can be added > without breaking existing clients (as long as there is a reasonable > default value for the newly added attributes) and it make usage for a > client easier IMO as one doesn't have to create an Options object > which is then passed to the constructor. > > --Gunnar > > > 2012/7/17 Sanne Grinovero <sa...@hibernate.org>: >> On 17 July 2012 03:57, Steve Ebersole <st...@hibernate.org> wrote: >>> Design question on how we want to handle this notion of delegates that >>> ogm, search, etc extend and constructors... >>> >>> Specifically the notion that Sanne has asked for where ORM provides >>> implementations of stuff that OGM, Search, etc can just extend. So, for >>> example, AbstractEntityManagerImpl. AbstractEntityManagerImpl defines a >>> (what I call) "strict verbose" constructor. It takes 4 constructor >>> args. However, now take the case of JPA 2.1 where there is a new >>> argument (via new overloaded method) for EM opening (new >>> SynchronizationType enum) that we will need to pass along to the >>> constructor of AbstractEntityManagerImpl. This is where, IMO, this >>> concept of delegates starts to break down *as we generally define ctors >>> today*. IMO, for this notion of delegates to work as intended, I think >>> we needs to provide "bundled" constructor forms. >>> >>> Again, taking AbstractEntityManagerImpl as the example, today we have: >>> >>> protected AbstractEntityManagerImpl( >>> EntityManagerFactoryImpl entityManagerFactory, >>> PersistenceContextType type, >>> PersistenceUnitTransactionType transactionType, >>> Map properties) { >>> ... >>> } >>> >>> >>> Leaving aside the passing of a Map for now... >>> >>> What I think works best in terms of maintaining the intention of these >>> delegates is: >>> >>> protected AbstractEntityManagerImpl( >>> AbstractEntityManagerImpl.Options options, >>> Map properties) { >>> ... >>> } >>> >>> or maybe even: >>> >>> protected AbstractEntityManagerImpl( >>> EntityManagerFactoryImpl entityManagerFactory, >>> AbstractEntityManagerImpl.Options options, >>> Map properties) { >>> ... >>> } >>> >>> >>> Where Options contains the things AbstractEntityManagerImpl needs to >>> initialize itself. Currently that would be 'type' and >>> 'transactionType', but JPA 2.1 would add 'synchronizationType' as well. >>> The point though is that OGM, Search etc would not need to be changed >>> at all here if the constructor had been defined to accept >>> AbstractEntityManagerImpl.Options before and we added >>> 'synchronizationType' in implementation of JPA 2.1. >>> >>> >>> Or is moving from JPA 2.0 to 2.1 going to warrant changes in OGM, Search >>> anyway that circumventing constructor signature changes is irrelevant? >> >> Indeed mayor changes in Hibernate will likely need specific release of >> OGM/Search/... >> >> The need for us to extend some core classes is to improve the odds, >> specifically thinking about minor releases: >> it happened that upgrading some Hibernate ORM 4.1.x to 4.1.y people >> would need a different Search version (and a release from our part). >> I understand we can't promise this won't happen, I just wish we make >> it "unlikely" to need specific versions to be coupled together. I've >> seen many users attempting to upgrade the stack updating one component >> at a time. >> >> If you can use this "Options" that's great, as it looks like a good >> design idea anyway, and I'm happy if you help "improving the odds" of >> Search/OGM editions being compatible with next Hibernate releases but >> there is no need to push this too far, so don't do this if it turns >> out impractical for other reasons. As you say, if this happens between >> a JPA 2.0 -> 2.1 it is very likely that compatibility will break for >> other reasons anyway. >> >> Cheers, >> Sanne >> _______________________________________________ >> hibernate-dev mailing list >> hibernate-dev@lists.jboss.org >> https://lists.jboss.org/mailman/listinfo/hibernate-dev > _______________________________________________ > hibernate-dev mailing list > hibernate-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/hibernate-dev > -- st...@hibernate.org http://hibernate.org _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev