2010-11-30 8 views
7

Ist es möglich, Tabellennamen in JPA/Hibernate, um außer Kraft zu setzen einen gemeinsamen Präfix für alle Projektgesellschaften hinzufügen? Zum Beispiel, um allen JBPM 5-Tabellen das Präfix "JBPM5_" voranstellen zu können.JPA (Hibernate) und benutzerdefinierte Tabellenpräfixe

Beispiel für die akzeptierte Antwort:

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

meinst du neben der '@ Table' Annotation? –

+0

Ja, abgesehen von der Annotation der Tabelle. Ich habe eigentlich ein 3rd-Party-Projekt gemeint, also ist nur die Konfiguration machbar (ich kann die kompilierte Java-Quelle nicht anfassen). –

+2

und es ist auch mühsam und fehleranfällig –

Antwort

25

Eine Möglichkeit, alle Tabellen auf einmal umbenennen, ist Ihre eigene namingStrategy (Implementierung von org.hibernate.cfg.NamingStrategy) zu implementieren.

Die NamingStrategy verwendet wird, durch

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

bearbeiten Könnte jemand eine standortweite Politik mit Anmerkungen zu den einzelnen Klassen zu implementieren und ein Beispiel zu dieser Antwort einfügen, bitte? –

18

Verwenden a NamingStrategy. Diese previous answer of mine sollte genau das liefern, was Sie brauchen.

aus früheren Antwort kopiert:

Hier ist ein Beispiel NamingStrategy dass Tabellennamen der Form TYPE1_TYPE2 für Tabellen verbinden und fügt einen gemeinsamen Präfix für alle Tabellen erstellt:

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 für Link zur Dokumentation – Ralph

+0

+1, wusste nie über NamingStrategy, Sie jeden Tag etwas Neues zu lernen! – Qwerky

+4

Es ist ein Winterschlaf spezifische Sache. Es funktioniert nicht mit anderen JPA-Anbietern –