2010-02-26 12 views
24

¿Es posible determinar el nombre de la tabla nativa de una entidad?¿Cómo recuperar el nombre de la tabla de asignación para una entidad en JPA en tiempo de ejecución?

Si una anotación Table está presente es fácil:

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

Pero ¿qué pasa si no hay Table anotación está presente?

Hibernate proporciona esta información a través de la clase Configuration:

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

¿Hay algo similar en APP?

+1

por lo que sé que esto no forma parte de la API estándar, por lo que tendrá que confiar en la implementación real (hibernación, enlace superior, ...) para obtener lo que desea –

Respuesta

3

Si no hay una anotación de tabla presente (y no hay ORM.xml), entonces en JPA, el nombre de la tabla se forma en función del nombre de la clase (consulte la especificación JPA). Entonces, ¿por qué exactamente necesitas un método de acceso?

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

+1

Quería evitar la implementación del algoritmo de nuevo. Y también quería evitar el análisis del archivo de mapeo XML. Pero ya pensé que no habría forma de pedirle a la implementación de JPA los nombres de las tablas reales. Muchas gracias. – marabol

+0

Puede anular el nombre utilizando el archivo orm.xml, por lo que la ejecución programada del algoritmo también debe leerse en el archivo orm correcto. –

+1

El enlace está muerto ... –

1

Si utiliza la anotación @Table, no hay ningún problema, como lo ha demostrado. Si no usa esa anotación, el nombre de la tabla es el mismo que el nombre de la clase (valor predeterminado de JPA).

La diversión comienza si usa el archivo de mapeo, necesita analizarlo y recuperar el nombre de la tabla, esto no es muy difícil, pero exige algo de trabajo. Si tiene miedo de los problemas de rendimiento, puede analizar los archivos de asignación una vez y almacenar en caché todos los nombres de las tablas.

11

Este es el método que estoy utilizando con EclipseLink (sin archivo de asignación):

/** 
* 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; 
} 
+0

No creas que es una forma correcta, p. ¿Qué devolvería el método para la entidad con el nombre SomeComplexName? – skwisgaar

+0

@skwisgaar 'SOMECOMPLEXNAME' en caso de que no haya una anotación' @ Table' en la entidad. De lo contrario, el 'nombre' especificado a través de la anotación' @ Table'. –

+0

El comportamiento predeterminado de fafa es mapear entidades camelcased en tablas snakecased (por ejemplo, SomeComplexName -> some_complex_name). Aunque podría estar equivocado :) – skwisgaar

0

Preguntar al meta-modelo de la subyacente ORM es la más fiable: mirando al la presencia del @Table no es suficiente, no solo se puede anular mediante la configuración XML (por ejemplo, orm.xml), sino que con la estrategia UNIFICADA, el @Table puede estar en una superclase.

+0

Esto es más un comentario. – jogo

Cuestiones relacionadas