Сопоставление Grails «один к одному» с общим идентификатором

У меня есть следующие доменные классы в Grails 2.3.11. Они сопоставляются с устаревшими таблицами базы данных, которые нельзя изменить. Оба класса имеют общий идентификатор pidm:

class Person {
    Long pidm
    String firstName
    String middleName
    Bio bio

    static mapping = {
        id name: 'pidm', generator: 'assigned'
        bio column: 'pidm'
    }
}

class Bio {
    Long pidm
    String ssn
    String gender
    Date birthDate

    static mapping = {
        id name: 'pidm', generator: 'assigned'
    }
}

В таблице Bio нет отдельного столбца person_id или чего-то подобного. Должно быть однозначное сопоставление через pidm.

В настоящее время единственный способ заставить это работать — добавить updateable: false, insertable: false к bio в блоке mapping. Что делать, если я хочу обновить и/или вставить экземпляр Bio? Есть ли лучший способ сделать это и поделиться столбцом pidm в качестве идентификатора для класса Person И в качестве ссылки на Bio?


person grantmcconnaughey    schedule 16.07.2014    source источник
comment
Действительно ли генератор «назначен», а первичным ключом является номер? Нет ли доступной последовательности для этих таблиц в устаревшей базе данных?   -  person dmahapatro    schedule 17.07.2014
comment
Есть, но мои приложения не будут создавать новые объекты Person или Bio. Отдельные системы обрабатывают создание записей в этих таблицах.   -  person grantmcconnaughey    schedule 17.07.2014


Ответы (1)


Вам нужно будет внести следующие изменения в свой класс Bio и связанные сопоставления:

  • Используйте генератор чужих идентификаторов.

  • Внедрите двунаправленную связь hasOne/belongTo.

  • Вы также должны убедиться, что любое свойство связанного элемента не может быть вставлено или обновлено.

Конкретный пример

http://blog.swwomm.com/2011/09/grails-foreign-id-generator.html

Другие ссылки

person rimero    schedule 16.07.2014
comment
Кажется, я не могу заставить это работать на меня даже в проекте Grails, в котором больше ничего нет. - person gailbear; 16.12.2014
comment
@GailTerman, вам нужно более конкретно указать, что вы пробовали, в идеале с некоторым кодом и трассировкой стека. Я вспоминаю некоторые незначительные проблемы с моей стороны, пытаясь заставить это работать в сжатые сроки. Я не слепо копировал/вставлял код из упомянутой статьи. - person rimero; 17.12.2014