Grails: Fremdschlüsselerzeugung durch Hibernate unterdrücken

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.

  1. public class PreventForeignKeyCreation extends GrailsAnnotationConfiguration {
  2.    private boolean _alreadyProcessed;
  3.    @SuppressWarnings({ "unchecked", "rawtypes" })
  4.    @Override
  5.    protected void secondPassCompile() throws MappingException {
  6.       super.secondPassCompile();
  7.       if (_alreadyProcessed) { return; }
  8.       for (PersistentClass pc : (Collection) classes.values()) {
  9.          if (pc instanceof RootClass) {
  10.             RootClass root = (RootClass) pc;
  11.             //Hier muss die Domainklasse, welche den Fremdschlüssel erzeugt eingetragen werden.
  12. 	    if ("mein.packet.MeineDomainKlasse".equals(root.getClassName())) {
  13.                for (Iterator iter = root.getTable().getForeignKeyIterator(); iter.hasNext();) {
  14.                   ForeignKey fk = (ForeignKey) iter.next();
  15.                   //Hier muss der Name des bereits existierenden Fremdschlüssels eingetragen werden.
  16.                   fk.setName("existierender_fremdschlüssel");
  17.                }
  18.             }
  19.          }
  20.       _alreadyProcessed = true;
  21.    }
  22. }

Diese Klasse muss dann in der DataSource.groovy z.B. wie folgt eingebunden werden

  1. environments {
  2.    development {
  3.       dataSource {
  4.          ..
  5.          configClass = 'mein.packet.PreventForeignKeyCreation'
  6.          ..
  7.       }
  8.    }
  9. }
Dieser Beitrag wurde unter Grails, Hibernate abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">