GWT RequestFactory: как обрабатывать объекты с составными первичными ключами

Может ли RequestFactory обрабатывать составные первичные ключи?

В документации упоминается, что объекты должны реализовывать getId(); как это должно быть реализовано в случае, когда объекты не имеют одного поля «id», а имеют несколько полей внешнего ключа, которые вместе составляют составной первичный ключ?


person George Armhold    schedule 09.02.2011    source источник


Ответы (1)


В GWT 2.1.1 свойства Id и Version могут относиться к любому типу, который RequestFactory умеет передавать. По сути, любой примитивный тип (int), упакованный тип (Integer) или любой объект, который имеет связанный тип Proxy. Вам не нужно самостоятельно уменьшать составной идентификатор до строки; сантехника RF может автоматически позаботиться о составных ключах, используя постоянный идентификатор ключа типа объекта или сериализованное состояние ключа типа значения.

Используя ранее опубликованный пример:

interface Location {
  public String getDepartment();
  public String getDesk();
}

interface Employee {
  public Location getId();
  public int getVersion();
}

@ProxyFor(Location.class)
interface LocationProxy extends ValueProxy {
  // ValueProxy means no requirement for getId() / getVersion()
  String getDepartment();
  String getDesk();
}
@ProxyFor(Employee.class)
interface EmployeeProxy extends EntityProxy {
  // Use a composite type as an id key
  LocationProxy getId();
  // Version could also be a complex type
  int getVersion();
}

Если вы не можете сократить идентификатор до одного свойства getId() в типе домена, вы можете использовать Locator для предоставления внешнего идентификатора и свойства версии. Например:

@ProxyFor(value = Employee.class, locator = EmployeeLocator.class)
interface EmployeeProxy {.....}

class EmployeeLocator extends Locator<Employee, String> {
  // There are several other methods to implement, too
  String getId(Employee domainObject) { return domainObject.getDepartment() + " " + domainObject.getDesk(); }
}

DevGuide, связанный с вопросом, немного устарел в отношении изменений RequestFactory. в версии 2.1.1

person BobV    schedule 10.02.2011
comment
Следует отметить, что составной идентификатор должен отображаться как ValueProxy (LocationProxy в приведенном выше коде), и этот прокси должен быть открыт где-то в прокси (т.е. достижим, когда вы проходите интерфейсы и методы, начиная с из GWT.create()d RequestFactory; в приведенном выше примере кода он доступен из getId на EmployeeProxy). - person Thomas Broyer; 15.02.2011
comment
О, и кстати, версия не обязательно должна отображаться на прокси. - person Thomas Broyer; 15.02.2011