2016-12-02 8 views
0
class Tooth { 
    Integer id 
    ToothDisease toothDisease 
    static mapping = { 
    table name: 'AK_TOOTH' 
    id generator: 'sequence', params: [sequence: 'SEQ_AK_TOOTH'] 
    columns{ 
     toothDisease { 
     column: 'FK_AK_TOOTH_ID' 
     column: 'FK_AK_TOOTH_NR_VERSION' 
     } 
    } 
} 
class ToothDisease implements Serializable{ 
    Integer idColumn 
    Integer nrVersion 
    static mapping = { 
    table name: 'AK_TOOTH_DISEASE' 
    idColumn column: 'ID', generator: 'sequence', params: [sequence: 'SEQ_AK_TOOTH_DISEASE'] 
    nrVersion column: 'NR_VERSION', 
    id composite ['idColumn','nrVersion'] 

    int hashCode() { 
    def builder = new HashCodeBuilder() 
    builder.append (idColumn) 
    builder.append (nrVersion) 
    builder.toHashCode() 
    } 

    boolean equals (other) { 
    if (other == null) { 
     return false 
    } 
    def builder = new EqualsBuilder() 
    builder.append (idColumn, other.idColumn) 
    builder.append (nrVersion, other.nrVersion) 
    builder.isEquals() 
    } 
} 

Когда я пытаюсь bootRun мое приложение я получаю BeanCreationException:Grails 3.1.6, Hibernate 4. Композитный внешнего ключа

Caused by: org.hibernate.MappingException: Foreign key (FK_1rnajvolkf4rkav5w1hl0l9fk:AK_TOOTH [tooth_disease_id,FK_AK_TOOTH_ID,FK_AK_TOOTH_NR_VERSION,tooth_disease_id_column,tooth_disease_nr_version])) must have same number of columns as the referenced primary key (AK_TOOTH_DISEASE [ID,NR_VERSION]). 

Когда я удалил столбец отображения раздел Зуб, то я получил ту же ошибку без этих колонн

[tooth_disease_id,tooth_disease_id_column,tooth_disease_nr_version]. 

можно явно определить ключевой столбец и referencedColumnName как в спящем режиме? Почему есть три столбца? особенно tooth_disease_id and tooth_disease_id_column columns в то же время. Я пытался использовать имя «PrimaryKey» в качестве составного первичного ключа для зубов и «ид» простой в столбце идентификаторов, но таким образом, у меня была такая же ошибка

Caused by: org.hibernate.MappingException: Foreign key (FK_1rnajvolkf4rkav5w1hl0l9fk:AK_TOOTH [tooth_disease_id,FK_AK_TOOTH_ID,FK_AK_TOOTH_NR_VERSION,tooth_disease_id_column,tooth_disease_nr_version])) must have same number of columns as the referenced primary key (AK_TOOTH_DISEASE [ID]).But there is only one referenced primary key. 

К сожалению, у меня нет возможности изменить структуру схемы и избегайте составного ключа.

ответ

0

Я нашел here обходной путь от Burt Беквит. Поскольку GrailsAnnotationConfiguration был заменен HibernateMappingContextConfiguration.groovy я сделал некоторые изменения в своем решении:

class CompositeForeignKeyConfiguration extends HibernateMappingContextConfiguration { 
    private static final long serialVersionUID = 1 
    private static final String TOOTH_CLASS_NAME = 'com.project.TOOTH' 
    private static final String TOOTH_ID_FK = 'FK_AK_TOOTH_ID' 
    private static final String TOOTH_VERSION_FK = 'FK_AK_TOOTH_NR_VERSION' 

    private boolean _alreadyProcessed 

    @SuppressWarnings ("unchecked") 
    @Override 
    protected void secondPassCompile() throws MappingException { 

    for (PersistentEntity pc : hibernateMappingContext.getPersistentEntities()) { 
     if (pc.name == TOOTH_CLASS_NAME) { 
     pc.getAssociations().each { Association mp -> 
      if (mp.name == 'toothDisease') { 
      PropertyConfig config = (PropertyConfig) mp.getMapping().getMappedForm() 
      if (config.columns.size() == 1) { 
       config.columns.clear() 
       final ColumnConfig fk1 = new ColumnConfig (name: TOOTH_ID_FK) 
       final ColumnConfig fk2 = new ColumnConfig (name: TOOTH_VERSION_FK) 
       config.columns << fk1 
       config.columns << fk2 
      } 
      } 
     } 
     } 

    } 

    super.secondPassCompile() 
    if (_alreadyProcessed) { 
     return 
    } 
    _alreadyProcessed = true 
    } 
} 
0

Я думаю, что ошибка вызвана тем, как вы объявляете FK ToothDisease в отображении Зуба.

Попробуйте это:

class Tooth { 
    Integer id 
    ToothDisease toothDisease 

    static mapping = { 
     table name: 'AK_TOOTH' 
     id generator: 'sequence', params: [sequence: 'SEQ_AK_TOOTH'] 
     toothDisease { 
      column name: 'FK_AK_TOOTH_ID' 
      column name: 'FK_AK_TOOTH_NR_VERSION' 
     } 
    } 

} 

class ToothDisease implements Serializable{ 
    Integer idColumn 
    Integer nrVersion 

    static mapping = { 
     table name: 'AK_TOOTH_DISEASE' 
     idColumn column: 'ID', generator: 'sequence', params: [sequence: 'SEQ_AK_TOOTH_DISEASE'] 
     nrVersion column: 'NR_VERSION' 
     id composite: ['idColumn','nrVersion'] 
    } 

    int hashCode() { 
     def builder = new HashCodeBuilder() 
     builder.append (idColumn) 
     builder.append (nrVersion) 
     builder.toHashCode() 
    } 

    boolean equals (other) { 
     if (other == null) { 
      return false 
     } 
     def builder = new EqualsBuilder() 
     builder.append (idColumn, other.idColumn) 
     builder.append (nrVersion, other.nrVersion) 
     builder.isEquals() 
    } 

} 
+0

Благодарим Вас за ответ, но это 't didn помочь мне. По-прежнему такая же ошибка с тремя столбцами для внешнего ключа. –

 Смежные вопросы

  • Нет связанных вопросов^_^