我有两个处于一对多关系的实体。按预期创建、更新和删除工作。但是,当我从数据库中读取实体时,关系字段保留为空集,而不是包含数据库中的对象。
这些是有问题的两个实体:
@Entity
@Table(name = "point_in_time")
class PointInTime(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long,
val title: String,
val note: String
) {
@OneToMany(mappedBy = "symptom", cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
var symptoms: Set<Symptom> = emptySet()
@field:Column(updatable = false)
val createdAt: Instant = Instant.now()
}
@Entity
@Table(name = "symptom")
@IdClass(SymptomId::class)
class Symptom(
@ManyToOne(optional = false)
@Id
@JoinColumn(name = "point_in_time_id", nullable = false)
var pointInTime: PointInTime,
@Id
val category: String,
@Id
val symptom: String,
val strength: Strength
)
存储库是一个简单的 JpaRepository,定义如下:
@Repository
interface PointInTimeRepository : JpaRepository<PointInTime, Long>
但是对象通过调用存储库上的以下方法返回
repository.findByIdOrNull(id)
只有一个空集
PointInTime.symptoms
我需要添加什么才能正确填写
symptoms
字段?我特别困惑,因为创建和更新该字段工作正常并且保存在数据库中。
mappedBy
看起来不正确:
@OneToMany(mappedBy = "symptom", cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
var symptoms: Set<Symptom> = emptySet()
mappedBy
告诉 Hibernate 查看 Symptom 类的 symptom
属性。
在你的情况下,它应该查看 pointInTime
字段。
像这样:
@OneToMany(mappedBy = "pointInTime", cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
var symptoms: Set<Symptom> = emptySet()