2016-01-01 3 views
0

Мне нужно отобразить классы домена и подклассы устаревшей базы данных.Grails/GORM Класс и подкласс с отображением составных клавиш

Модели Тат мне нужно обновить с Grails к этим столикам:

Tables structure

CARD_PAYMET и CHEQUE_PAYMENT является подклассами ОПЛАТЫ и делитесь составным ключом из двух мест: OrderId и PaymentID.

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

Может ли кто-нибудь мне помочь?

Спасибо.

+0

Как наследование смоделированным в старой базе данных? –

+0

В какой-то момент ваш вопрос неясно. Пожалуйста, прочитайте свой вопрос и добавьте код класса домена. –

ответ

0

Ваша база данных выглядит как подходящая для table-per-subclass inheritance. Во-первых, поскольку вы используете составной первичный ключ, ваши классы домена должны реализовать интерфейс Serializable. Затем нужно передать каждому столбцу таблицы значение свойства.

import groovy.transform.EqualsAndHashCode 

@EqualsAndHashCode(includes=['orderId', 'paymentId']) 
class Payment implements Serializable { 
    int orderId 
    int paymentId 
    float amount 

    static mapping = { 
     version false 
     tablePerHierarchy false 
     id composite: ['orderId', 'paymentId'] 
     orderId column: 'OrderId' 
     paymentId column: 'PaymentId' 
     /* Assuming case-insensitive db, so I left out 'Amount'. */ 
    } 
} 

class CardPayment extends Payment { 
    String cardType 

    static mapping = { 
     version false 
     cardType column: 'CardType' 
    } 
} 

class ChequePayment extends Payment { 
    int checkNumber 

    static mapping = { 
     version false 
     checkNumber column: 'CheckNumber' 
    } 
} 

Примечание: В этом примере я использовал EqualsAndHashCode AST преобразования Groovy для реализации Serializable.

С классами домена в месте вы будете в состоянии сделать Горм полиморфных запросов:

def payments = Payment.list() // All Payments (Payment, CardPayment, and ChequePayment). 
def cardPayments = CardPayment.list() // Only CardPayments. 
... 
def nicePayments = Payment.where { amount > 1000 }.list() 
+0

Эммануэль: Я уже пробовал этот сценарий, и у меня есть исключение, когда я пытаюсь запустить приложение: при отображении ключа подкласса имеет неправильное количество столбцов, когда Grails пытается развернуть любой из подклассов Платежа –

+0

Кроме того, вот ошибка трассировки стека: Вызывается MappingException: сопоставление ключей подкласса имеет неправильное количество столбцов: pagos.CardPayment type: component [orderId, paymentId] –

+0

Я провел некоторое экспериментирование и пришел к выводу, что наследование на основе таблицы на подкласс не поддерживает составные первичные ключи :(возможно создать классы домена для таблиц, но только без наследования.Я создал демо с использованием черты Groovy.Он работает ... ОК. Очевидно, что вы не получаете полиморфных запросов, и вам нужно управлять ссылочной целостностью вручную. здесь: https://bitbucket.org/erosa/inheritance-example/overview. –

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

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