Hibernate ассоциация кэширования - PullRequest
0 голосов
/ 23 февраля 2012

Вопрос I

Согласно руководству Grails

Помимо возможности использовать кэш второго уровня Hibernate для кэширования экземпляров, вы также можете кэшировать коллекции (ассоциации) объектов.Например:

class Person {

  static hasMany = [addresses: Address]

  static mapping = { 
    cache true
    addresses cache: true 
  } 
}

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

class Address {

  static belongsTo = [person: Person]

  static mapping = { 
    cache true
    person cache: true // is this necessary?
  } 
}

Очевидноимеет смысл кэшировать обратные отношения только в том случае, если (в нашем коде приложения) мы перемещаемся от адреса к персоне, но при условии, что отношение перемещается в обоих направлениях, нужно ли его также кэшировать в обоих направлениях?* Вопрос II

Предыдущий вопрос касается кеширования в контексте отношения 1: N.Если вместо этого соотношение между ними равно 1: 1, предположительно, можно ли / можно указать одинаковое поведение при кэшировании?Например:

class Person {

  static hasOne = [address: Address]

  static mapping = { 
    cache true
    address cache: true 
  } 
}

class Address {

  static belongsTo = [person: Person]

  static mapping = { 
    cache true
    person cache: true
  } 
}

Вопрос III

Если у нас есть отношение N: N между двумя объектами, и мы ориентируемся в отношении в обоих направлениях, следующий правильный способ кэшированияассоциации:

class Person {

  static hasMany = [personAddress: PersonAddress]

  static mapping = { 
    cache true
    personAddress cache: true 
  } 
}

class PersonAddress {
  static belongsTo = [person: Person, address: Address]

  static mapping = { 
    cache true
    person cache: true
    address cache: true
  } 
}

class Address {

  static hasMany = [personAddress: PersonAddress]

  static mapping = { 
    cache true
    personAddress cache: true
  } 
}

1 Ответ

1 голос
/ 23 февраля 2012

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

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

...