[hibernate-dev] HHH-5024 : MappedSuperclass and Static Metamodel Generator
Steve Ebersole
steve at hibernate.org
Mon Jan 9 18:52:08 EST 2012
Ok, this is odd. For the mappedsuperclass/idclass one, the metamodel
classes were provided. I ditched those and had the metamodel generator
generate them. And it seemed to have the same confusion:
public abstract class AbstractAttribute_ {
public static volatile SingularAttribute<AbstractAttribute, String>
value;
public static volatile SingularAttribute<AbstractAttribute, String>
owner;
public static volatile SingularAttribute<AbstractAttribute, String>
key;
}
public abstract class ProductAttribute_ extends
org.hibernate.ejb.test.metadata.mappedsuperclass.idclass.AbstractAttribute_
{
public static volatile SingularAttribute<ProductAttribute, String>
owner;
public static volatile SingularAttribute<ProductAttribute, String> key;
}
Anyway, given that static metamodel definition the tests pass. But it
only ever only asserts bases on ProductAttribute_. I added tests then
based on AbstractAttribute_ and they still fail.
On Mon 09 Jan 2012 04:04:25 PM CST, Steve Ebersole wrote:
> 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