首页 > 解决方案 > 使用 JPA、Kotlin 和 @ElementCollection 重新创建表

问题描述

我有奇怪的问题。这是我的代码:

@Table(name = "rank")
@Entity
data class Rank(
        @Id
        private val id: String,

        @Embedded
        private var rankValue: RankValue,

        @ElementCollection
        @CollectionTable(
                name="rank_change",
                joinColumns = [JoinColumn(name = "rank_id")]
        )
        private val set: MutableSet<RankChange>

) {

    fun calculateDifference(loseRank: Rank, rankPolicy: RankPolicy): Double {
        return rankPolicy.calculateRankDifference(rankValue.value, loseRank.rankValue.value)
    }

    fun addChange(difference: Double, now: LocalDateTime, sparringId: String? = null) {
        rankValue = rankValue.apply(difference)
        set.add(RankChange(date = now, value = difference, sparringId = sparringId))
    }
}
@Embeddable
data class RankChange(
        @Column(name = "date")
        private val date: LocalDateTime,

        @Column(name = "value")
        private val value: Double,

        @Column(name = "sparring_id")
        private val sparringId: String? = null
)

当我将元素添加到MutableSet<RankChange>休眠时,会删除“rank_change”表并逐行插入。也许我应该实现equals和hash code contract还是使用MutableList<T>和添加@OrderColumn注释?但我真的不需要订单。

标签: hibernatekotlinjpacollectionshibernate-mapping

解决方案


@ElementCollection从这个意义上讲,它的行为类似于单向@OneToMany,它删除所有行并从内存中的集合中一一插入元素。

为避免这种情况,您可以创建一个单独的实体来保存元素并使 ( @OneToMany- @ManyToOne) 关系双向(mappedBy在父端和@JoinColumn子端)。


推荐阅读