[hibernate-dev] 6.0 - Type redesign
Steve Ebersole
steve at hibernate.org
Fri Jul 22 10:59:01 EDT 2016
Some preliminary thoughts are inline. Like I said in the earlier reply I
am still trying to distill this in total.
On Fri, Jul 22, 2016 at 4:14 AM Emmanuel Bernard <emmanuel at hibernate.org>
wrote:
> The good news is that I am following you :D
>
> I think one of the option is some API to which you can pass the (JPA)
> Type, a Path from root and it would return a structure qualifying the
> embedded info and not just the embeddable.
>
> I'm making things up here
>
> //might not even need the type, could be guessed from the Path?
> AttributeMapping am = mappingProvider.forPath(path);
>
> What's nasty is that it then requires two parallel APIs, or rather it
> would not flow from an enhanced JPA type API.
>
Yes, this is more or less one option I had considered... at least the
general approach is the same. Basically 2 separate, parallel ways to
describe attribute/mapping info.
However, that said, even Path (assuming you specifically
mean javax.persistence.criteria.Path) includes the "context" we need; it
has to ultimately be rooted back to a root (#getParentPath) with mapping
information: we cannot build a Path rooted at an embeddable.
So to further define these 2 "separate, parallel" models:
1. Type would only ever deal with the generic model information (aligned
with JPA) by Attribute. Meaning this simply describes the domain model -
more or less, obviously it does expose some simplistic persistence data
points like inheritance-type, singular attribute "classifications", etc
mandated by the JPA contracts.
2. The idea of a "mapping model" would more follow this Path/Binadable
model. This would be the purpose of persisters and its exposed
"MappedAttributes"
Yes, it would be much nicer if we could combine these models/concepts, but
I think the JPA model is just too limited to allow that.
An alternative would be what I think you propose with the BindableType,
> that is an extension point that describes the specifics of the
> specialization when navigating from one node type to another. I think.
>
Yes, and no. Based on that break-down above - BindableType would just be
things that can be part of a Path. In fact, in JPA Bindable/BindableType
has no correlation to its Type. Bindable simply unifies things that can be
part of a query Path which could be either:
1. an EntityType
2. a SingularAttribute
3. a PluralAttribute
This distinction is great because it happens to line up with how we see
this mapping information (with the assumption that a "root" can only ever
be the first - an EntityType). So I'd slightly alter this list to say that
Bindable can be either:
1. an EntityType*
2. a SingularMappedAttribute
3. a PluralMappedAttribute
(*) - can be root.
The idea of "MappedAttribute" would essentially be a composition of
1. Attribute
2. MappedAttributeContainer - extension of Bindable
I think that Path will not work for modeling since Path is specifically a
query concept and could be circular.
More information about the hibernate-dev
mailing list