Как расширить класс пользователя Spring Security в Grails? - PullRequest
3 голосов
/ 30 июня 2011

Я использую плагин Spring Security в своем приложении Grails. Я расширил класс Springs User в своем собственном сгенерированном классе Physician. Теперь, когда я запускаю приложение, я не получаю таблицу врача в базе данных, а в классе пользователя есть только все свойства, определенные в Домене врача. Мне нужна отдельная таблица для врача.

Когда я пытаюсь найти всех пользователей в таблице пользователей с помощью User.findAll (), мой вывод будет

[com.HospitalManagement.User: 1, com.HospitalManagement.User: 2, com.HospitalManagement.User: 3, com.HospitalManagement.User: 4, com.HospitalManagement.User: 5, com.HospitalManagement.User: 6, com.HospitalManagement.User: 7, com.HospitalManagement.User: 8, com.HospitalManagement.User: 9]

но я ожидал значения имени пользователя и других свойств врача.

В чем может быть проблема?

Класс домена:

package com.HospitalManagement

class Physician extends User{

    static constraints = {
    }

    String specilty;
    String MobileNo;
    String Physician_Address;
    String clinicals;


}

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

По умолчанию GORM использует модель таблицы на иерархию для классов домена с наследованием.Все поля в родительском классе и все поля в каждом подклассе будут храниться в одной таблице.

Если вы хотите отключить эту функцию, вы можете использовать параметр отображения tablePerHierarchy.Если для этого параметра установлено значение false, поля родительского класса будут помещены в общую родительскую таблицу, а поля для каждого подкласса - в свою собственную таблицу.Это может сделать ваши запросы немного менее эффективными, потому что запросы будут иметь объединения, но если дерево наследования невелико, разница должна быть незначительной.Вот как это будет выглядеть с вашим классом домена:

package com.HospitalManagement

class Physician extends User {

    static constraints = {
    }

    String specilty;
    String MobileNo;
    String Physician_Address;
    String clinicals;


    static mapping = {
        tablePerHierarchy false
    }
}

См. Документацию Grails для получения дополнительной информации:

Если вы хотите, чтобы у каждого подкласса была своя собственная таблица, содержащая все поля из родительского класса и все поля из подкласса, то вы можете определить родительскийКласс как «абстрактный», и это должно помешать Grails сделать отдельную таблицу для него.Grails должен создавать таблицы только для конкретных классов домена, а не для абстрактных классов домена.[ Источник ]

Ваш пользовательский класс будет выглядеть примерно так:

abstract class User {
    String username
    String password
    //etc...
}

Это будет правильно составлять таблицы, хотя я не уверен, какой эффектэто может иметь место в Spring Security.Если после абстракции класса User вы увидите какие-либо ошибки Spring Security, я вернусь к отключению таблицы на иерархию и работе с объединениями.

0 голосов
/ 27 марта 2013

Похоже, вы пытаетесь отобразить атрибуты объекта. Возможно, вы просто хотите переопределить toString() для вашего Physician класса:

package com.HospitalManagement

    class Physician extends User{

        static constraints = {
        }

        String specilty;
        String MobileNo;
        String Physician_Address;
        String clinicals;

        String toString() {
            "specilty: $specilty, MobileNo: $MobileNo, Physician_Address: $Physician_Address, clinicals: $clinicals"
        }
    }

или что-то в этом роде, в зависимости от того, как вы хотите отформатировать вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...