2010-11-30 18 views
7

¿Es posible anular los nombres de tabla en JPA/Hibernate para agregar un prefijo común para todas las entidades de proyecto? Por ejemplo, para poder prefijar todas las tablas JBPM 5 por el prefijo "JBPM5_".JPA (Hibernate) y prefijos de tabla personalizados

Ejemplo para la respuesta aceptada:

public class JBPM5NamingStrategy extends ImprovedNamingStrategy { 
    public String classToTableName(String className) { 
     return StringHelper.unqualify(className); 
    } 
    public String propertyToColumnName(String propertyName) { 
     return propertyName; 
    } 
    public String tableName(String tableName) { 
     return "JBPM5_" + tableName; 
    } 
    public String columnName(String columnName) { 
     return columnName; 
    } 
    public String propertyToTableName(String className, String propertyName) { 
     return "JBPM5_" + classToTableName(className) + '_' 
     + propertyToColumnName(propertyName); 
    } 
} 
+0

te refieres aparte de la anotación '@ Table'? –

+0

Sí, aparte de la anotación de Tabla. En realidad, me refiero a un proyecto de terceros, por lo que solo la configuración es viable (no puedo tocar la fuente compilada de Java). –

+2

y también es tedioso y propenso a errores implementar una política en todo el sitio usando anotaciones en clases individuales –

Respuesta

25

Una forma de cambiar el nombre de todas las mesas a la vez, es implementar su propio NamingStrategy (aplicación de org.hibernate.cfg.NamingStrategy).

El NamingStrategy utilizado se especifica dentro de persistence.xml por

<property name="hibernate.ejb.naming_strategy" 
      value="com.example.MyNamingStrategy" /> 
+5

¿Podría alguien editar y pegar un ejemplo a esta respuesta, por favor? –

18

Utilice un NamingStrategy. Este previous answer of mine debe proporcionar exactamente lo que necesita.

Copiado respuesta anterior:

Aquí es una NamingStrategy muestra que construye nombres de tabla de la TYPE1_TYPE2 forma para unir tablas y añade un prefijo comunes a todas las tablas:

public class CustomNamingStrategy extends ImprovedNamingStrategy { 

    private static final long serialVersionUID = 1L; 
    private static final String PREFIX = "PFX_"; 

    @Override 
    public String classToTableName(final String className) { 
     return this.addPrefix(super.classToTableName(className)); 
    } 

    @Override 
    public String collectionTableName(final String ownerEntity, 
      final String ownerEntityTable, final String associatedEntity, 
      final String associatedEntityTable, final String propertyName) { 
     return this.addPrefix(super.collectionTableName(ownerEntity, 
       ownerEntityTable, associatedEntity, associatedEntityTable, 
       propertyName)); 
    } 

    @Override 
    public String logicalCollectionTableName(final String tableName, 
      final String ownerEntityTable, final String associatedEntityTable, 
      final String propertyName) { 
     return this.addPrefix(super.logicalCollectionTableName(tableName, 
       ownerEntityTable, associatedEntityTable, propertyName)); 
    } 

    private String addPrefix(final String composedTableName) { 

     return PREFIX 
       + composedTableName.toUpperCase().replace("_", ""); 

    } 

} 
+0

+1 para el enlace a la documentación – Ralph

+0

+1, nunca supe sobre NamingStrategy, ¡aprende algo nuevo todos los días! – Qwerky

+4

Es algo específico de hibernación. No funciona con otros proveedores de JPA –

Cuestiones relacionadas