Как получить имя таблицы сопоставления для объекта в JPA во время выполнения?
Можно ли определить имя собственной таблицы сущности?
Если присутствует аннотация Table
, это легко:
entityClass.getAnnotation(Table.class).name()
Но как насчет аннотации Table
?
Hibernate предоставляет эту информацию через Configuration
класс:
configuration.getClassMapping(entityClass.getSimpleName()).getTable().getName()
Есть ли что-то подобное в JPA?
Ответы
Ответ 1
Если никакой аннотации таблицы не присутствует (и нет ORM.xml), то в JPA имя таблицы формируется на основе имени класса (см. спецификацию JPA). Почему именно вам нужен метод доступа?
См. http://www.datanucleus.org/products/accessplatform_2_0/jpa/orm/datastore_identifiers.html
Ответ 2
Это метод, который я использую с EclipseLink (без файла сопоставления):
/**
* Returns the table name for a given entity type in the {@link EntityManager}.
* @param em
* @param entityClass
* @return
*/
public static <T> String getTableName(EntityManager em, Class<T> entityClass) {
/*
* Check if the specified class is present in the metamodel.
* Throws IllegalArgumentException if not.
*/
Metamodel meta = em.getMetamodel();
EntityType<T> entityType = meta.entity(entityClass);
//Check whether @Table annotation is present on the class.
Table t = entityClass.getAnnotation(Table.class);
String tableName = (t == null)
? entityType.getName().toUpperCase()
: t.name();
return tableName;
}
Ответ 3
Если вы используете аннотацию @Table, нет проблем, как вы показали. Если вы не используете эту аннотацию, то имя таблицы совпадает с именем класса (по умолчанию JPA).
Веселье начинается, если вы используете файл сопоставления, вам нужно разобрать его и получить имя таблицы - это не очень сложно, но требует некоторой работы. Если вы боитесь проблем с производительностью, вы можете разобрать файл файла один раз и кэшировать все имена таблиц.
Ответ 4
Задача метамодели подстилающей ORM является самой надежной: недостаточно внимания присутствию @Table не только можно переопределить с помощью конфигурации XML (например, orm.xml), но с помощью стратегии JOINED, @Table может быть в суперклассе.