[hibernate-dev] how to get an EntityBinding by class name?
Steve Ebersole
steve at hibernate.org
Fri Jul 6 10:21:26 EDT 2012
>> In Hibernate you can map the same class multiple times using
>> different entity names. The map of entity bindings kept in Metadata
>> contains
>> all entity bindings keyed against these unique names. Trying to look
>> up a binding by class name is not unique and we would have to deal with
>> multiple bindings.
>>
>> >From a JPA perspective you cannot map a class multiple times. You
>> can give it an alternate name via @Entity#name, but that's about it
>> (names
>> must be unique within the persistence unit). If I am not mistaken atm
>> JPA entities are mapped in the entityBindingMap map using the
>> unqualified
>> class name (which is probably wrong).
That would be an error if that is true. They definitely should be
getting keyed by their entity-name (which in normal cases is the FQN of
the entity class).
>> In the source interfaces we have:
>>
>> EntitySource#getEntityName()
- this is the Hibernate notion of an entity name. In JPA this will
always be the same as the entity class name. In Hibernate this is the
entity name associated with this entity mapping. As Hardy points out
this can be multiple entity names pointing to the same entity class.
>> EntitySource#getClassName()
- this is the string representation of the entity class name (its
Class#getName). This can potentially be null eventually using
Hibernate notion of MAP entity mode, though we really have not
integrated that into the metamodel code as of yet.
>> EntitySource#getJpaEntityName() // taken from @Entity#name
- this is the JPA @Entity#name value as already pointed out. In HBM
cases this will be null.
>> Last but not least, looking at @EntityResult I can see that the
>> connection to the corresponding entity is made via a Class reference
>> (EntityResult#entityClass()), not
>> by name. I guess that's why you need to this in the lookup in the
>> first place. For this use case iterating seems fair enough for the
>> moment.
Any JPA API is going to deal with the @Entity Class reference. In
those cases the correct thing to do is to resolve that Class to
entity-name using Class#getName and do the lookup. If we want to
support something like @EntityResult with Hibernate-style entity-names
we will need to provide a another "alternate" (set of) annotation(s) to
accept the String entityName.
--
steve at hibernate.org
http://hibernate.org
More information about the hibernate-dev
mailing list