У меня есть проект, разработанный с использованием Spring boot, hibernate и kotlin, и в одном из моих объектов JPA я перешел от использования enum в качестве свойства к использованию закрытого класса. Тем не менее, hibernate жалуется во время загрузки:
Encountered Java type [class com.example.myapp.OrderState] for which we could not locate a JavaTypeDescriptor and which does not appear to implement equals and/or hashCode. This can lead to significant performance problems when performing equality/dirty checking involving this Java type. Consider registering a custom JavaTypeDescriptor or at least implementing equals/hashCode.
Полагаю, я мог бы предоставить JavaTypeDescriptor, equals и hashCode, но я начинаю задумываться, действительно ли запечатанные классы не предназначены для работы непосредственно с hibernate? Начиная с enum, мне также пришлось добавить собственный сериализатор / десериализатор для записи / чтения из нижележащего столбца postgresql. Таким образом, шаблон начинает накапливаться здесь:
sealed class OrderState {
object RECEIVED : OrderState()
object SIGNED : OrderState()
object FAILED : OrderState()
object COMPLETED : OrderState()
object REJECTED : OrderState()
val name: String
get() = when (this) {
is RECEIVED -> "RECEIVED"
is SIGNED -> "SIGNED"
is FAILED -> "FAILED"
is COMPLETED -> "COMPLETED"
is REJECTED -> "REJECTED"
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is OrderState) return false
if (this.name != other.name) return false
return true
}
override fun hashCode(): Int {
return this.name.hashCode()
}
}
@Converter
class OrderStateConverter : AttributeConverter<OrderState, String> {
override fun convertToDatabaseColumn(orderState: OrderState): String = orderState.name
override fun convertToEntityAttribute(columnValue: String): OrderState =
OrderState::class.sealedSubclasses
.firstOrNull { columnValue == it.simpleName }
?. objectInstance
?: error("Could not map OrderState from string $columnValue")
}
Я решил пойти на запечатанный класс, потому что я использую его в валидаторе, где я получаю помощь от компилятора для обработки всех значений, используя исчерпывающий, когда .
Есть мысли?