Grails / Gorm, поддерживающие разные родительские сущности в 1 - много ассоциаций - PullRequest
1 голос
/ 22 октября 2011

У меня есть следующие «доменные» (родительские) доменные сущности:

Клиент
Компания
Контакт

И следующий дочерний объект:

Адрес

Между всеми сущностями домена верхнего уровня существует отношение один ко многим:

Клиент -> Адрес
Компания -> Адрес
Контакт-> Адрес

т. Е. У клиента, компании или контакта может быть один или несколько адресов.

К сожалению, я не знаю, как смоделировать это в grails / gorm.Кажется, я могу определить только один родительский объект или объявление ownTo в адресе, т.е. я не смог объявить адрес с помощью:

Address {
    Customer parent //??
    Company parent //??
    Contact parent //??
}

Может кто-нибудь сказать мне, если я что-то упустил или возможно определить этот типотношения в поддерживаемом виде?

Спасибо,

cowper

Ответы [ 2 ]

3 голосов
/ 22 октября 2011

Вы должны быть в состоянии использовать версию массива belongsTo, как указал Тим:

Address {
    static belongsTo = [Customer, Company, Contact]
}

Если сущности могут иметь общий адрес, это может изменить способ, которым вы настраиваете удаления.

Другой вариант - эти три класса наследовать свойство от суперкласса , но имеет ли это смысл в вашем случае, я не знаю (это своего рода не похоже)

1 голос
/ 22 октября 2011

В нашем приложении у нас есть несколько объектов, которым нужны адреса.Но мы решили смоделировать их в отношениях «многие ко многим».

Адрес выглядит следующим образом

class Address {

  // typical address properties

  Set<Company> getCompanies() {
    CompanyAddress.findAllByAddress(this).collect { it.company } as Set
  }

  static constraints = {
    // typical constraints
  }
}

И для каждого «родителя» мы предоставляем геттер.Вы можете увидеть getCompanies () в коде выше.Если у каждого из вас будет только 1 компания на один адрес, просто попросите, чтобы получатель вернул 1 компанию вместо набора.Обратное верно внутри компании, у нас есть getAddresses ().

Адрес компании, например, выглядит следующим образом ...

class CompanyAddress implements Serializable{

  Address address
  Company company

  boolean equals(other) {

    if (this.is(other)){
      return true
    }

    if (!(other instanceof CompanyAddress)) {
      return false
    }

    other.address?.id == address?.id &&
        other.company?.id == company?.id
  }

  int hashCode() {
    def builder = new HashCodeBuilder()
    if (address) builder.append(address.id)
    if (company) builder.append(company.id)
    builder.toHashCode()
  }

  static CompanyAddress get(long companyId, long addressId) {
    find 'from CompanyAddress where address.id=:addressId and company.id=:companyId',
      [addressId: addressId, companyId: companyId]
  }

  static CompanyAddress create(Company company, Address address, boolean flush = false) {
    new CompanyAddress(address: address, company: company).save(flush: flush, insert: true)
  }

  static boolean remove(Company company, Address address, boolean flush = false) {
    CompanyAddress instance = CompanyAddress.findByAddressAndCompany(address, company)
    instance ? instance.delete(flush: flush) : false
  }

  static void removeAll(Address address) {
    executeUpdate 'DELETE FROM CompanyAddress WHERE address=:address', [address: address]
  }

  static void removeAll(Company company) {
    executeUpdate 'DELETE FROM CompanyAddress WHERE company=:company', [company: company]
  }

  static mapping = {
    id composite: ['address', 'company']
    version false
  }
}
...