https://github.com/hibernate/hibernate-orm/pull/591


On Thu 05 Sep 2013 10:06:14 PM CDT, Shaozhuang Liu wrote:
> I can give it a try
> -------------------------
> Best Regards,
>
> Strong Liu <stliu at hibernate.org>
> http://about.me/stliu/bio
>
> On 2013Sep 6, at 8:15 AM, Steve Ebersole <st...@hibernate.org> wrote:
>
>> I have something mostly working and not causing regressions.  Its quite 
>> fugly, but I blame that on binders and hcann :)
>>
>> I'd really like to do a pull request for this one and have y'all take a 
>> look.  But at the same time I'd also really like to do the 4.3 Beta4 release 
>> tomorrow.  Anyone familiar with those bits of code willing to look this over 
>> in the next 12 hours if I go through the steps of creating the PR?
>>
>>
>> On 09/05/2013 12:10 PM, Steve Ebersole wrote:
>>> On Thu 05 Sep 2013 11:52:22 AM CDT, Shaozhuang Liu wrote:
>>>>> Also, I am not sure that iterating properties yet again is a great idea.
>>>>>
>>>>> One alternative I had considered was to hook this in with
>>>>> PropertyBinder, where it calls SimpleValueBinder.  That needs to happen
>>>>> anyway; the plan was to delegate the call to determine the Convert to
>>>>> use PropertyHolder and to pass that Convert into SimpleValueBinder.
>>>>> That code would need to pass in the XProperty anyway.  So currently
>>>>> PropertyBinder does:
>>>>>
>>>>> simpleValueBinder.setType( property, returnedClass, containerClassName );
>>>>>
>>>>> My plan was to instead have it do:
>>>>>
>>>>> simpleValueBinder.setType( property, returnedClass, containerClassName,
>>>>> holder.resolveAttributeConverter( property ) );
>>>>>
>>>>> I *think* that when resolveAttributeConverter() would be called, we'd
>>>>> have enough info to fully resolve the converter to use properly.
>>>>>
>>>>> There are similar concerns in ComponentPropertyHolder, but maybe a
>>>>> discussion of the above will shed light on those concerns too.
>>>>
>>>> doesn't this work?
>>>
>>> What exactly?
>>>
>>>
>>>> at this time, the PropertyHolder is resolved, so it knows the convert it 
>>>> holds,
>>>> then the convert defined on the attribute get applied first, then the one 
>>>> in PropertyHolder
>>>
>>> I am not sure what you mean by "resolved" here.  At no time that is useful 
>>> in this process does PropertyHolder have full access to all the properties 
>>> the thing holds.
>>>
>>> If by "the convert it holds" you mean the converts specifically defined on 
>>> the @Entity or @Embedded (and therefore @Embeddable), then yes.
>>>
>>> But "then the convert defined on the attribute get applied first" is 
>>> actually wrong for composite paths.  For composites, you actually want the 
>>> one higher up to have higher precedence.  In the Person.homeAddress.city 
>>> example, a convert defined on Address#city should actually have the 
>>> *lowest* precedence.
>>>
>>> I think what we'll have to end up doing is to not normalize the composite 
>>> paths to one place unfortunately.   Then we'd have to pass the XProperty 
>>> for which we are trying to resolve the converter to use into the 
>>> PropertyHolder method.  For composite paths this will just have to mean 
>>> walking multiple levels (one per path-part).  The down side to this is that 
>>> at no time do we have an overview of the overall converts for a property 
>>> path (aside from walking the composite path to actually resolve the 
>>> converter to use).
>>>
>>>
>>>>
>>>> any problem with this approach ?
>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Wed 04 Sep 2013 02:44:40 PM CDT, Steve Ebersole wrote:
>>>>>>
>>>>>> I am still a bit confused on how to apply the normalization to make
>>>>>> sure it happens in the proper order.
>>>>>>
>>>>>> Let's look at:
>>>>>>
>>>>>> @Entity
>>>>>> class Person {
>>>>>> ...
>>>>>> @Embedded
>>>>>> @Convert( attributeName="city", converter=Converter2.class )
>>>>>> public Address homeAddress;
>>>>>> }
>>>>>>
>>>>>> @Embeddable
>>>>>> class Address {
>>>>>> ...
>>>>>> @Convert( converter=Converter1.class )
>>>>>> public String city;
>>>>>> }
>>>>>>
>>>>>>
>>>>>> So here, the Converter2 class ought to be the one applied to
>>>>>> "homeAddress.city" path.
>>>>>>
>>>>>> Now granted there are a few different ways to skin this cat, but the
>>>>>> plan I had was to normalize these all on the root of the path. So
>>>>>> here, both of these conversions would get stored on
>>>>>> ClassPropertyHolder<Person> under the "homeAddress.city" path. When I
>>>>>> go to build the SimpleValue for Person.homeAddress.city, I'd ask the
>>>>>> CompositePropertyHolder for Person.homeAddress to resolve the explicit
>>>>>> (non-autoApply) conversion for its city attribute (the simple value).
>>>>>> The trouble I have though is applying the conversions in the proper
>>>>>> order. For example, here, I'd want to apply the conversions defined
>>>>>> directly on the Embeddable first (the Embeddable conversions should
>>>>>> always act as the baseline), then the conversions at its Embedded
>>>>>> point (via XML or annotations).
>>>>>>
>>>>>> One idea was to hook into org.hibernate.cfg.PropertyHolder#addProperty
>>>>>> in terms of normalizing the paths. I am just not sure of the timing
>>>>>> between these PropertyHolder#addProperty (and how populated the passed
>>>>>> Property objects are at that point) and the calls to
>>>>>> SimpleValueBinder/PropertyBinder.
>>>>>>
>>>>>> Interestingly, I still am not sure we have enough here to report an
>>>>>> error in cases like:
>>>>>>
>>>>>> @Entity
>>>>>> @Convert( attributeName="homeAddress.city", converter=Converter3.class )
>>>>>> class Person {
>>>>>> ...
>>>>>> @Embedded
>>>>>> @Convert( attributeName="city", converter=Converter2.class )
>>>>>> public Address homeAddress;
>>>>>> }
>>>>>>
>>>>>> Unless we somehow kept "proximity info" or "location info" about the
>>>>>> conversion in PropertyHolder.
>>>>>>
>>>>>>
>>>>>> On Wed 04 Sep 2013 01:27:21 AM CDT, Emmanuel Bernard wrote:
>>>>>>>
>>>>>>>
>>>>>>> On Tue 2013-09-03 17:22, Steve Ebersole wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> 2.a) It seems like there are times when
>>>>>>>> org.hibernate.cfg.AbstractPropertyHolder#parent would be useful for
>>>>>>>> what I need to do. But there appears to be times when this is null.
>>>>>>>> For entity mappings (ClassPropertyHolder) thats fine. But for the
>>>>>>>> others, that would be problematic. Going back to the
>>>>>>>> Person#homeAddress example, I'd really need the
>>>>>>>> ComponentPropertyHolder for Person#homeAddress to register the
>>>>>>>> converts with ClassPropertyHolder<Person> under the "homeAddress"
>>>>>>>> base key ("homeAddress.city" for example). Is there a time here
>>>>>>>> where AbstractPropertyHolder#parent would be null for
>>>>>>>> ComponentPropertyHolder/CollectionPropertyHolder?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> I looked around the code base and the only case I could find is for
>>>>>>> ClassPropertyHolder whose parent is indeed null.
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> 2.b) Is this AbstractPropertyHolder#parent the best way you see to
>>>>>>>> handle path-based converts? Or do you see a better option?
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Yes I still think it's the best aproach and frankly I don't quite see
>>>>>>> alternatives.
>>>>> _______________________________________________
>>>>> 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