Grails - Как реализовать отношение внешнего ключа без использования столбца id? - PullRequest
1 голос
/ 06 января 2011

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

Моя проблема в том, что у меня есть два класса:

Компания
OrderConfig

OrderConfig содержит две ссылки на компанию. 1 для грузополучателя, 1 для грузоотправителя. Я реализовал эту взаимосвязь (см. Ниже), и все выглядит прекрасно, с моей таблицей order_config, содержащей столбец consignee_company_id и столбец shipper_company_id.

Однако я не хочу или не нуждаюсь в столбце company_id вообще. Я бы предпочел использовать CompanyName в качестве идентифицирующего столбца. Как я могу запретить Grails автоматически добавлять столбец id в таблицу компании и вместо этого использовать столбец companyName в качестве первичного ключа, гарантируя, что будет сгенерирована моя таблица order_config, содержащая companyName, а не company_id?

Я пытался встроить компанию в класс orderconfig и боролся со всеми другими вариантами, включая сопоставления, однако у меня возникли проблемы с каждым из них.

Заранее спасибо!

Пока мой код:

class OrderConfig {
 static hasMany = [consignee:Company, shipper:Company]

  String toString() {
    return "${consignee}"
 }

    static constraints = {
      consignee (blank:false, maxSize:10)
      shipper (blank:false, maxSize:10)
  }

  Company consignee
  Company shipper
}




class Company {
    String toString() {
    return "${companyName}"
 }

static constraints = {
    companyName(blank:false, maxSize:10)
    companyAddress1(blank:false, maxSize:40)
    companyAddress2(blank:false, maxSize:40)
    companyAddress3(blank:false, maxSize:40)
    companyAddress4(blank:false, maxSize:40)
    companyZipCode(blank:false, maxSize:36)
    companyCountry(blank:false, maxSize:36)
}

  String companyName
  String companyAddress1
  String companyAddress2
  String companyAddress3
  String companyAddress4
  String companyZipCode
  String companyCountry
}

1 Ответ

1 голос
/ 06 января 2011

Вам необходимо ознакомиться с дополнительными параметрами конфигурации GORM в документации, в разделе 5.5.2.1

Есть пример

class Person {
  String firstName
  static hasMany = [addresses:Address]
  static mapping = {
      table 'people'
      firstName column:'First_Name'
      addresses joinTable:[name:'Person_Addresses', key:'Person_Id', column:'Address_Id']
  }
}

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

Редактировать - я перечитал ваш вопрос: если вы спрашиваете, как изменить его, чтобы у компании был назначенный идентификатор, вы могли бы сделать что-то подобное этому примеру

static mapping = {
    id generator:'assigned', column:'column_name',name:'propertyName'
}

, где больше вариантов доступно здесь: http://www.grails.org/doc/1.3.x/ref/Database%20Mapping/id.html

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