如何在运行时检索JPA中实体的映射表名?

2022-09-01 06:15:22

是否可以确定实体的本机表名?

如果存在注释,则很容易:Table

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

但是,如果没有注释呢?Table

休眠通过配置类提供以下信息:

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

JPA中是否有类似的东西?


答案 1

这是我与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;
}

答案 2

如果不存在表注释(也没有 ORM.xml),则在 JPA 中,表名是根据类名形成的(参见 JPA 规范)。因此,为什么你究竟需要一个访问器方法?

查看 http://www.datanucleus.org/products/accessplatform_2_0/jpa/orm/datastore_identifiers.html


推荐