In meinem aktuellen Grails-Projekt lasse ich die Datenbank nicht von Grails (Hibernate) erstellen, sondern habe diese selbst erzeugt. In meinem Datenbankmodell sind alle notwendigen Fremdschlüsselbeziehungen und Indizes bereits enthalten. Trotzdem versucht Hibernate immer eigene Fremdschlüsselbeziehungen anzulegen. Diese haben nicht nur nichtssagende Namen wie z.B. „FK79D00A76C682495E“ sondern sind auch schlicht redundant.
Um in einem Grails-Projekt Hibernate daran zu hindern eigene Fremdschlüsselbeziehungen anzulegen, muss eine „GrailsAnnotationConfiguration“-Klasse erstellt und eingebunden werden.
public class PreventForeignKeyCreation extends GrailsAnnotationConfiguration {
private boolean _alreadyProcessed;
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected void secondPassCompile() throws MappingException {
super.secondPassCompile();
if (_alreadyProcessed) { return; }
for (PersistentClass pc : (Collection) classes.values()) {
if (pc instanceof RootClass) {
RootClass root = (RootClass) pc;
//Hier muss die Domainklasse, welche den Fremdschlüssel erzeugt eingetragen werden.
if ("mein.packet.MeineDomainKlasse".equals(root.getClassName())) {
for (Iterator iter = root.getTable().getForeignKeyIterator(); iter.hasNext();) {
ForeignKey fk = (ForeignKey) iter.next();
//Hier muss der Name des bereits existierenden Fremdschlüssels eingetragen werden.
fk.setName("existierender_fremdschlüssel");
}
}
}
_alreadyProcessed = true;
}
}
Diese Klasse muss dann in der DataSource.groovy z.B. wie folgt eingebunden werden
environments {
development {
dataSource {
..
configClass = 'mein.packet.PreventForeignKeyCreation'
..
}
}
}