带有休眠java.io.NotSerializableException

时间:2019-08-18 13:46:13

标签: hibernate caching kotlin spring-data

我在科特林有以下课程

@Entity
@Cacheable
@Table(name = "fine")
@EntityListeners(FineSpecificationListener::class)
class FineSpecification (
    @EmbeddedId
    val id: FineSpecificationId,

    @Column(name = "fine")
    val fine: Int,

    @Column(name = "min_fine")
    val minimumFine: Int
): ValueObject<FineSpecification> {

    @Transient
    lateinit var algorithm: FineCalculationAlgorithm



    override fun sameValueAs(other: FineSpecification): Boolean {
        return Objects.equal(id, other.id) &&
            Objects.equal(fine, other.fine) &&
            Objects.equal(minimumFine, other.minimumFine)
    }

    override fun equals(other: Any?): Boolean {
        if (other == null || this::class != other::class)
            return false

        val compareTo = other as FineSpecification
        return sameValueAs(compareTo)
    }

    override fun hashCode(): Int {
        return Objects.hashCode(id, fine, minimumFine)
    }

    override fun toString(): String {
        return "FineSpecification(id=$id, fine=$fine, minimumFine=$minimumFine)"
    }

    fun calculateFine(dues: Long, dueDate: Date, currentDate: Date): Long {
        return algorithm.calculateFine(arrears = dues, dueDate = dueDate, currentDate = currentDate)
    }
}
class FineSpecificationId (
    @Column(name = "effect_from")
    val effectFrom: Date,

    @Column(name = "effect_to")
    val effectTo: Date,

    @Column(name = "cat_code")
    @Convert(converter = CategoryConverter::class)
    val category: Category
): Serializable {
    companion object {
        private const val serialVersionUID = 20190819075136L
    }
    override fun toString(): String {
        return "FineSpecificationId(effectFrom=$effectFrom, effectTo=$effectTo, category=$category)"
    }
}

enum class Category (
    val code: String
): Serializable {
    DOMESTIC("D"),
    NON_DOMESTIC("N"),
    INDUSTRIAL("I"),
    SPECIAL("S");


    companion object {
       private const val serialVersionUID = 20190819075150L
    }


    override fun toString(): String {
        return code
    }

}

我正在将Spring Data与Hibernate一起使用,并使用hibernate ehcache。我想缓存FineSpecification,但是当我这样做时,出现了以下异常

18 Aug 2019; 18:56:50.563 ERROR n.s.e.store.disk.DiskStorageFactory - Disk Write of domain.model.bill.fine.FineSpecification#FineSpecificationId(effectFrom=Thu Apr 01 00:00:00 IST 1999, effectTo=Thu Dec 31 00:00:00 IST 2020, category=D) failed: 
java.io.NotSerializableException: org.hibernate.metamodel.model.convert.internal.JpaAttributeConverterImpl

据我所知,它与FineSpecificationId以及Category枚举类有关。我已经实现了Serializable接口,但是没有任何效果。

在这种情况下,我应该怎么做才能实现缓存?

0 个答案:

没有答案