Hibernate жалуется на отсутствие JavaTypeDescriptor, equals и hashCode для закрытого класса kotlin - PullRequest
0 голосов
/ 08 октября 2019

У меня есть проект, разработанный с использованием 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")
}

Я решил пойти на запечатанный класс, потому что я использую его в валидаторе, где я получаю помощь от компилятора для обработки всех значений, используя исчерпывающий, когда .

Есть мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...