为什么 JpaRepository 对于这个一对多关系返回一个空集?

问题描述 投票:0回答:1

我有两个处于一对多关系的实体。按预期创建、更新和删除工作。但是,当我从数据库中读取实体时,关系字段保留为空集,而不是包含数据库中的对象。

这些是有问题的两个实体:

@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
字段?我特别困惑,因为创建和更新该字段工作正常并且保存在数据库中。

spring-boot hibernate kotlin jpa spring-data
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.