/**
   * Creates foreign keys for subclass tables that are mapped using table per subclass. Further
   * information is available in the <a href="http://jira.grails.org/browse/GRAILS-7729">JIRA
   * ticket</a>
   */
  private void createSubclassForeignKeys() {
    if (subclassForeignKeysCreated) {
      return;
    }

    for (PersistentClass persistentClass : classes.values()) {
      if (persistentClass instanceof RootClass) {
        RootClass rootClass = (RootClass) persistentClass;

        if (rootClass.hasSubclasses()) {
          Iterator subclasses = rootClass.getSubclassIterator();

          while (subclasses.hasNext()) {

            Object subclass = subclasses.next();

            // This test ensures that foreign keys will only be created for subclasses that are
            // mapped using "table per subclass"
            if (subclass instanceof JoinedSubclass) {
              JoinedSubclass joinedSubclass = (JoinedSubclass) subclass;
              joinedSubclass.createForeignKey();
            }
          }
        }
      }
    }

    subclassForeignKeysCreated = true;
  }