Устаревшее отображение в Grails / GORM: один класс домена и две таблицы в отношении 1: N - PullRequest
1 голос
/ 12 марта 2009

Допустим, у меня есть две таблицы сотрудник и зарплата с отношением 1: N (одна зарплата может быть связана со многими сотрудниками).

В простом SQL таблицы будут объединены с:

SELECT e.id, e.name, s.salary FROM employee e, salary s WHERE s.id = e.salary_id AND e.id = 12345;

Если предположить следующий класс домена на основе GORM, как мне сопоставить унаследованную структуру базы данных с классом?

class Employee {
   String name
   int salary
}

Пояснение # 1: Мне нужен только один класс домена, содержащий данные из обеих таблиц. Добавление другого класса, следовательно, не вариант.

Пояснение # 2: Вопрос, на который я пытаюсь найти ответ, заключается просто в том, «как мне сопоставить две таблицы в один класс с помощью Grails / GORM»? Если вы считаете, что это невозможно сделать, укажите это в своем ответе, а не пытайтесь повторить вопрос.

Ответы [ 4 ]

2 голосов
/ 16 марта 2009

IMO с обычными Grails / GORM невозможно объединить несколько таблиц и сопоставить их с одним классом домена. В качестве обходного пути вы можете использовать устаревшее XML-отображение гибернации и использовать функцию join для достижения желаемой цели. Конечно, вы потеряете много вкусностей GORM.

0 голосов
/ 14 марта 2009

Я не совсем понимаю ограничение на невозможность добавить другой класс, если в базе данных есть 2 таблицы, но если вы ищете унифицированный интерфейс, будет ли работать делегирование методов в Salary класс

Что-то вроде:

class Salary {
    int amount
}

class Employee {
    Salary _salary
    String name

    String toString() { name }

    public Integer getSalary() {
        return _salary?.amount
    }
    public void setSalary(Integer amount) {
    // not quite sure of your business logic here, this is a guess
        _salary = Salary.findByAmount(amount)
        if (!_salary) {
            _salary = new Salary(amount: amount)
            _salary.save()
        }
    }
}


def e = new Employee(name:"willy loman", salary: 100)
e.save()
assert e.salary == 100

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

См. Раздел Пользовательский тип пользователя на этой странице .

0 голосов
/ 14 марта 2009

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

Разумеется, это не путь Грааля, и настоятельно рекомендуется, чтобы вы следовали пути Грааля.

0 голосов
/ 12 марта 2009

Ваш пример SQL показывает, что есть две таблицы: Employee и Salary. Это также должно быть отражено в ваших классах. Таким образом, вместо одного вам нужно два класса. Тогда отображение GORM будет выглядеть следующим образом.

class Employee {
   String name
   Salary salary
}

class Salary {
   static hasMany = [ employees : Employee ]
   int salary
}

См. http://www.grails.org/GORM+-+Defining+relationships

...