[hibernate-dev] HHH-5024 : MappedSuperclass and Static Metamodel Generator

Steve Ebersole steve at hibernate.org
Mon Jan 9 17:04:25 EST 2012


I also got a working test case now using EmbeddedId as well.  See tests 
in
* 
hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/metadata/mappedsuperclass/embeddedid
* 
hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/metadata/mappedsuperclass/idclass


On Mon 09 Jan 2012 03:47:40 PM CST, Steve Ebersole wrote:
> I should point out... this *only* fails when the entity 
> (ProductAttribute) is annotated with an @IdClass
>
> On Mon 09 Jan 2012 03:06:51 PM CST, Steve Ebersole wrote:
>> There is definitely an issue here. The code in HEM is just wrong. I 
>> am not familiar enough with the code/spec here in regards to static 
>> metamodel generation to determine the appropriate fix on my own.
>>
>> The model in question there is essentially:
>>
>> @MappedSuperclass
>> abstract class AbstractAttribute {
>> protected String key;
>> protected String value;
>>
>> public abstract String getOwner();
>>
>> @Column(name = "attribute_key")
>> public String getKey() { return key; }
>>
>> @Column(name = "attribute_value")
>> public String getValue() { return value; }
>>
>> // setters
>> }
>>
>> then we have:
>>
>> @Entity
>> public class ProductAttribute extends AbstractAttribute {
>> private String owner;
>>
>> @Id @Column(name = "owner")
>> public String getOwner() { return owner; }
>>
>> @Id @Column(name = "attribute_key")
>> public String getKey() { return key; }
>>
>> // setters
>> }
>>
>> The attributes in question are the 2 (key,owner) that get overridden 
>> in the subclass. We end up with a mismatch.
>>
>> The metamodel generator does:
>>
>> @StaticMetamodel(AbstractAttribute.class)
>> public abstract class AbstractAttribute_ {
>>
>> public static volatile SingularAttribute<AbstractAttribute, Integer> 
>> owner;
>> public static volatile SingularAttribute<AbstractAttribute, String> 
>> value;
>> public static volatile SingularAttribute<AbstractAttribute, String> key;
>> }
>>
>> @StaticMetamodel(ProductAttribute.class)
>> public abstract class ProductAttribute_ extends AbstractAttribute_ {
>> }
>>
>> In the type system however only value shows up as "declared" by 
>> AbstractAttribute. These other 2 show up as being declared by 
>> ProductAttribute, presumably because that is where there ultimate 
>> metadata is defined.
>>
>> I think the metamodel is defined correctly, but then that leaves a 
>> question as to how we handle that for the type system 
>> (org.hibernate.mapping.MappedSuperclass).
>>
>

-- 
steve at hibernate.org
http://hibernate.org



More information about the hibernate-dev mailing list