hibernate - 使用 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
注释?但我真的不需要订单。
解决方案
@ElementCollection
从这个意义上讲,它的行为类似于单向@OneToMany
,它删除所有行并从内存中的集合中一一插入元素。
为避免这种情况,您可以创建一个单独的实体来保存元素并使 ( @OneToMany
- @ManyToOne
) 关系双向(mappedBy
在父端和@JoinColumn
子端)。
推荐阅读
- django - 如何打印出链接到 django 中特定模型的 ForeignKey 模型?
- javascript - 在本地机器上运行 codepen 项目的问题
- sql - 根据另一张表将一条记录拆分为多条
- php - Json 编码格式错误
- python - Python - 处理数组中项目的最快方法,每个项目都有保证的延迟
- arrays - 如何使用 VBScript 将数组与数组进行比较?
- javascript - Vue 异步组件回调
- c++ - 如何在 C++ 中创建指向向量的静态指针?
- asp.net-mvc - 从身份服务器请求用户声明和令牌的功能?
- php - 基于特定事件类型 ID 的唯一输入字段