2010-02-10 7 views
3

Я играю в Aroud с Grails и нахожу ORM-материал утомительным, потому что я не совсем понимаю, что я делаю, когда дело доходит до классов домена. Я надеюсь, что кто-то может поставить меня обратно на трекТаблицы ссылок «многие-ко-многим» в граалах (GORM)/hibernate

Рассмотрим следующий

тестовое задание One: Многие аппаратные средства, используемые на Иова Много: Один Physical Оборудование

... это аналогично к классическому Order, OrderLine, сценарий продукта видели в примерах DB университета

Я создал следующие доменные классы

class Job 
{ 
    String jobName 
    String jobDescription 
} 

class HardwareOnJob 
{ 
    static hasMany = [ jobs:Job, physicalHardware:PhysicalHardware ] 
    static belongsTo = Job 

    String role 
} 

class PhysicalHardware 
{ 
    String assetName 
    String model 
    String os 
} 

Вопрос, который я должен задать, - это то, почему Грайл создает мне две дополнительные таблицы в моей базе данных, а не использует объект/класс связи, который я определил. Например, Grails создает в базе данных hardware_on_job_job и hardware_on_job_physical_hardware.

Использование контроллеров лесов Я могу ввести некоторые аппаратные средства, ввести задание, а затем ввести ссылку два вместе. У меня есть вопрос, почему он создает эти две дополнительные таблицы, а не использует объект домена (HardwareOnJob), который я указал.

Любая помощь/руководство было бы очень оценено, так как собираюсь сходить с ума, глядя на это и пробовать новые вещи. Btw I'm on grails version 1.2.1

ответ

0

При использовании одного или многих или многих связей граф создает таблицу соединений, содержащую идентификаторы объектов в этой связи. Вы можете избежать использования таблицы соединений, сообщив граалям, чтобы использовать внешний ключ в отношениях от одного до многих. Насколько я знаю, нет способа избежать использования автоматически созданной таблицы соединений во многих отношениях. Для получения дополнительной информации см разделы 5.2.1.2 и 5.2.1.3 из this, а также this

+0

Благодаря этим помогли направить меня в правильном направлении – K2J

0

ИТАК после игры вокруг, я придумал следующую структуру

class Job 
{ 
    String jobName 
    String jobDescription 

    static mapping = { 
    id column:"jobId" 
    } 

    static hasMany = [hardware:HardwareOnJob] 
} 

class HardwareOnJob 
{ 
    String role 
    Job job 
    PhysicalHardware hardware 


    static mapping = { 
    id column:"hardware_on_job_id" 
    } 

} 

class PhysicalHardware 
{ 
    String assetName 
    String model 
    String os 

    static mapping = { 
    id column:"physical_hardware_id" 
    } 

    static hasMany = [hardwareOnjob:HardwareOnJob] 
} 

Это выглядит разумным для всех остальных ? Созданная структура базы данных выглядит гораздо более дружелюбной и имеет только три таблицы, которые я ожидаю.

Заинтересованы в том, чтобы услышать мысли людей, исходя из реляционного фона. Я рассматриваю создание объекта как средство для создания четкого дизайна db с точки зрения его простоты, чтобы сообщить об этом.

Комментарии приветствуются

+1

я бы говорят, что для многих приложений структура базы данных, создаваемая Grails, не имеет значения, потому что она достаточно быстрая, и данных недостаточно, чтобы требовать настройки базы данных. Я работаю над приложением Grails, где я еще не видел структуру БД (используя БД в памяти). Однако, когда вы знаете, что ваше приложение Grails будет напряженным для БД, тогда вы лучше настроите его с самого начала, но изменение классов домена позже будет болезненным. –

+0

Почему вы указываете столбцы id? Вы должны полностью удалить отображение столбцов id. – Blacktiger

+0

Если вы можете сказать мне, почему я должен делать это, это поможет мне понять, поскольку я сказал, что я новичок в граале. Многие разработчики полностью игнорируют базу данных и рассматривают ее как некоторый немой уровень хранения. Учитывайте, когда приложение активно, и данные начинают накапливаться. Я хочу хороший и понятный дизайн базы данных, с которым я могу легко писать отчеты. Причиной таблицы ссылок является то, что я хочу сохранить элемент как встроенный quanity с полями, которые связывают таблицы вместе. Рассмотрим строку заказа, которая составляет счет-фактуру. Надеюсь, что все имеет смысл. – K2J

4

взглянуть на joinTable ключевое слово, которое:

Customizes таблицу присоединиться, используемый для ненаправленной один-ко-многим, многие-ко-многим и примитивные типы коллекций

Вот пример из руководства пользователя:

class Book { 
    String title 
    static belongsTo = Author 
    static hasMany = [authors:Author] 

    static mapping = { 
     authors joinTable:[name:"mm_author_books", key:'mm_book_id' ] 
    } 
} 
class Author { 
    String name 
    static hasMany = [books:Book] 

    static mapping = { 
     books joinTable:[name:"mm_author_books", key:'mm_author_id'] 
    } 

} 
1

рассмотрим использование явного класса/таблицы ассоциации.см. членский класс в http://www.grails.org/Many-to-Many+Mapping+without+Hibernate+XML

Боковое преимущество - это леса для класса ассоциации (вы не получите это без явного класса ассоциации).

0

Короче говоря, если Ребенок имеет ровно один родитель, то в Родитель, вы положили

static hasMany = [children: Child] 

и ребенка, вы положили

static belongsTo = [parent: Parent] 

(или, если вы не хотите, каскадное, я думаю, что добавлено «родительского родителя» было бы достаточно, но это более редкий случай, который я бы догадался)

Это создает двунаправленное отношение, в котором в объекте дочернего домена вы можете получить доступ к родительскому объекту t через свойство, а в родительском объекте у вас есть детская коллекция.

Обычно это создает столбец в Child, удерживая идентификатор для его родителя. Этого не может быть много для многих, когда потребуется какая-то таблица ссылок (и GORM справится с этим). Так называемый «односторонний» отношения (как у вас в вашем первом примере) также может создать ссылку таблицы, что объясняется немного этим:

http://grails.1312388.n4.nabble.com/Many-to-many-vs-Many-to-one-td1369336.html

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

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