Идентификатор в доменной модели в случае, когда натуральный идентификатор недоступен - PullRequest
0 голосов
/ 07 марта 2019

Допустим, у меня есть модель домена без естественного идентификатора.

class Offer {
  ClientId clientId;
  CompanyId companyId;
  OfferDetails details;
}

Предложение загружается из базы данных автоматически сгенерированным ключом.Затем он модифицируется, например, путем вызова бизнес-метода accept, reject или renegotiate.Чтобы сохранить предложение, у меня должен быть этот автоматически сгенерированный ключ.Как мне подключить доменную сущность и идентификатор из БД?Прямо сейчас у меня есть OfferId класс с идентификатором db и версией (я использую JPA для сохранения совокупности).Есть ли лучший подход?

1 Ответ

0 голосов
/ 08 марта 2019

Сейчас у меня есть класс OfferId с идентификатором db и версией

Версия не должна быть частью идентификатора.Идентификатор должен быть неизменным.

Существует несколько стратегий для генерации идентификатора, но вот общие:

  • Используйте GUID, который устраняет необходимость попадания в общие данныесохранить для генерации идентификатора.
  • Реализовать операцию nextId(): OfferId в вашем хранилище (реализация может использовать последовательность БД и т. д.):

    Offer offer = new Offer(offerRepo.nextId(), ...);
    
  • Разрешить* Класс Offer, который нужно создать без идентификатора и настроить ORM для его генерации.Я не совсем уверен в спецификации JPA, но кажется, что в Hibernate вы можете комбинировать аннотации @IdClass и @GenerateValue, чтобы отобразить сгенерированную БД идентификацию в класс идентификатора упаковки.Взгляните на этот тестовый пример .

Честно говоря, я не люблю делегировать присвоение / генерацию идентификатора в ORM.Если вы хотите сгенерировать идентификатор из БД, я бы предложил второй описанный мной подход с методом в хранилище (или выделенной службой), который может вернуть следующий идентификатор.

...