Я использую JHipster (или KHipster, его проект Kotlin).Поскольку все сущности генерируются KHipster, я не хочу изменять эти файлы, поскольку все мои изменения будут отменены, когда я заново создаю сущность.После экспериментов с различными решениями я решил добавить дополнительный слой-обертку.
Обертка - это как PR-менеджер для сущности.Он может быть построен из сущности, затем он может быть изменен на уровне обслуживания, и как только настало время его сохранить, оболочка вернет вам обновленную сущность.
Вот так примерно выглядит сущность KHipsterкак:
@Entity
class Agreement(
@Id
var id: Long? = null, // should be immuatble
var description: String? = null, // cannot be null, immutable if `isSigned == true`
var isSigned: Boolean? = null,
)
Использование этой сущности напрямую подвержено ошибкам и не очень удобно.Оболочка решает все эти проблемы:
class AgreementWrapper(agreement: Agreement) {
val id = agreement.id // NOTICE that we can now use `val`
var description: String = agreement.description!! // NOT NULLABLE
set(value) {
if (isSigned == true) throw Exception("A signed agreement cannot be changed!")
field = value
}
var isSigned = agreement.isSigned!!
set(value) {
if (isSigned == true && value == false) throw Exception("You cannot undo it!")
field = value
}
val entity: Agreement // This will give us back the updated entity
get() {
return Agreement(id, description, isSigned)
}
}
Кроме того, обертка может также использоваться для создания новых объектов.Добавление значений по умолчанию к сущностям (например, добавление метки времени) также потребует изменения файла, созданного KHipster, но здесь с этим нет проблем.Я просто добавил еще один конструктор в оболочку, которая принимает необходимые параметры и в противном случае использует значения по умолчанию.Он также может иметь дело с проверкой и ведением журнала.
Таким образом, обертки действуют как мост между сущностями и уровнем обслуживания.