1) is very much how I envisioned the state objects to be used (e.g., data 
processed from a particular source that initializes an implementation of a 
common "state" interface). 

I like what you proposed for 2), however I would like to see bindings that are 
immutable, at least after being built. I really dislike having setters 
available when the session factory is being built.

In addition, I'd like to suggest that state APIs be defined and bound according 
to use case. From what I have seen, is not very difficult to determine the use 
case given the data. IMO, dealing with one use case at a time would make the 
processing code straightforward and easier to maintain.

As an example, I've listed the different types of composite IDs in 
http://opensource.atlassian.com/projects/hibernate/browse/HHH-6234 . The old 
HbmBinder code attempts to have different types of composite IDs fit the same 
mold, which makes the source code very difficult to maintain without breaking 
something. IMO, composite IDs could be very much simplified if taken one use 
case at a time.

----- Original Message -----
From: "Steve Ebersole" <st...@hibernate.org>
To: hibernate-dev@lists.jboss.org
Sent: Wednesday, June 22, 2011 3:16:36 PM
Subject: [hibernate-dev] metamodel thoughts

Wanted to get my thoughts on the current state of the metamodel down so 
we could all discuss.

First to define some vocab for discussing.  I say that the old code 
(Configuration, HBMBinder/AnnotationBinder, mapping package) used a 
"push" model.  The binders interpreted the various user supplied values 
and made decisions *pushing* the results of those decisions to the 
mapping classes.  The new code attempts a "pull" approach.  The user 
values are interpreted into BindingState and RelationalState objects 
which get passed in to the Binding objects which *pull* the data from 
the states.

At the most basic of descriptions, what is it we are trying to 
accomplish here?  Well we have some mapping information supplied by the 
user in a number of forms (hbm, annotations, etc) and need to correctly 
build/populate a binding model based on the values and interpretations 
of those values.

In designing I always go back to the question of "how would I accomplish 
this task by hand".  Here, the first thing I see is that we have user 
values in multiple formats.  So the very first thing I would do, 
ideally, is to some how normalize values from those different "sources". 
  I would then take those normalized values and then populate the 
binding model.

So here is what I suggest:
1) What we currently call "state" objects would serve the role of this 
normalization.  We would have specific things to normalize hbm, 
annotations, etc.  It could even be just different implementations of 
the same normalized interface which are constructed with whatever they 
need to answer the contract queries.
2) These normalized value objects are then passed into THE binder which 
uses the information there to build and populate the bindings.  2 things 
to note here.  First I said THE binder.  The idea is that there is just 
one for both annotations and hbm as the differences were removed during 
normalization.  Second this part is a push approach.  Specifically that 
means the bindings and models are mutable.

In my mind this sits between push and pull (or does each)

-- 
Steve Ebersole <st...@hibernate.org>
http://hibernate.org
_______________________________________________
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

Reply via email to