org.hibernate.MappingException при использовании стратегии наследования tablePerConcreteClass в Grails v3.2.9 - PullRequest
0 голосов
/ 26 ноября 2018

Я использую Grails v3.2.9

У меня есть 2 класса домена (класс A и класс B), имеющие некоторые общие свойства.Я создал новый класс C, извлек общие свойства из A и B в C и сделал A и B для расширения C, как показано ниже:

class A extends C {
   String x
   static constraints = {}
}

class B extends C {
   String y
   static constraints = {}
}

class C {
   String z

   static constraints = {}

   static mapping = {
    tablePerConcreteClass true
   }
}

Я хочу, чтобы C отражал JPA @MappedSuperClass, поэтому я проверил документацию для grails v3.1.12 и обнаружил около tablePerConcreteClass, что, как представляется, именно то, что мне нужно, однако в документация для Grails v3.2.9 там есть примечание о tablePerConcreteClass, и я даже не уверен, поддерживается ли эта стратегия Grails 3.2.9 или нет.

В любом случае я пытался использовать tablePerConcreteClass с моим grails v3.2.9 и получил следующее исключение:

org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [org.grails.orm.hibernate.HibernateDatastore]: исключение конструктора;вложенное исключение: org.hibernate.MappingException: org.hibernate.dialect.MySQL5Dialect не поддерживает последовательности

Я видел несколько решений для создания родительского класса в пакете src/groovy и его абстрактного представления, ноэто не то, что мне нужно, я хочу, чтобы родительский класс также был классом домена, чтобы можно было записывать ограничения и в одном месте.

ОБНОВЛЕНИЕ ***** Также я узналчто если я сделаю C абстрактным, вставлю в него отношение и сделаю A для его расширения следующим образом:

abstract class C {
   Bar bar

   static constraints = {}
}

class A extends C {
   String x
   static constraints = {}
}

, тогда искусственное свойство barId, позволяющее получить идентификатор отношениябез загрузки, не создается grails, поэтому использование A.get(1).barId приводит к groovy.lang.MissingPropertyException.В отличие от этого, если мы помещаем отношение Bar bar в подкласс A, то создается искусственное свойство barId, поэтому, пожалуйста, укажите решение этой проблемы, если оно есть.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете использовать абстрактный родительский класс и по-прежнему записывать ограничения в одном месте.

Например, вы можете поместить C в src / main / groovy следующим образом:

@grails.gorm.dirty.checking.DirtyCheckDirtyCheck
abstract class C {
    String z

    static constraints = {}
} 

Тогда в A и B ваш блок ограничений будет выглядеть следующим образом:

static constraints = {
    importFrom C
}

Вы можете даже добавить дополнительные ограничения после строки importFrom, если A и B могут иметь разные дополнительные ограничения, которые не существуютв к.

...