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