Подтвердить что ты не робот

Как получить имя таблицы сопоставления для объекта в JPA во время выполнения?

Можно ли определить имя собственной таблицы сущности?

Если присутствует аннотация Table, это легко:

entityClass.getAnnotation(Table.class).name()

Но как насчет аннотации Table?

Hibernate предоставляет эту информацию через Configuration класс:

configuration.getClassMapping(entityClass.getSimpleName()).getTable().getName()

Есть ли что-то подобное в JPA?

4b9b3361

Ответ 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 может быть в суперклассе.