【问题标题】:JPA: Is it possible for the target of a relationship to be a non entity?JPA:关系的目标是否可能是非实体?
【发布时间】:2018-03-25 21:57:29
【问题描述】:

以下代码在 Kotlin 中。

我有一个TestExecutionSummary 实体

@Entity
class TestExecutionSummary : Serializable {
    @EmbeddedId
    lateinit var id: TestExecutionId
    ...
    @OneToMany(cascade = [CascadeType.ALL], mappedBy = "testExecutionSummary")
    var failures: List<TestFailure> = mutableListOf()     
}
@Embeddable
data class TestExecutionId(
        var stepExecutionId: Long,
        var jobExecutionId: Long
) : Serializable

还有一个TestFailure 实体

@Entity
class TestFailure : Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    var id: Long? = null
    @Column(length = 999)
    lateinit var testId: String
    @JoinColumns(
            JoinColumn(name = "stepExecutionId", referencedColumnName = "stepExecutionId"),
            JoinColumn(name = "jobExecutionId", referencedColumnName = "jobExecutionId")
    )
    @ManyToOne
    lateinit var testExecutionSummary: TestExecutionSummary
    @Column(length = 999)
    var message: String? = null
}

这很好用,但让我烦恼的是TestFailure 没有独立存在,并且不真正符合 IMO 实体的资格。是否可以在不使TestFailure 成为实体的情况下保持显示的关系?

【问题讨论】:

  • IMO 关系应该被非规范化。但是为什么你需要一个列表?一个标志(如果需要,+列)是否足以表明测试失败?
  • @MontassarElBéhi 我不关注。如果一次测试执行导致多次失败。你将如何用“一个标志(如果需要的话+列)”来坚持这一点?
  • 就个人而言,我发现将关系视为一个实体通常非常有用。还经常发生的是,您稍后会找到要添加到此关系/实体的其他属性。我说只是接受这个想法......
  • @AbhijitSarkar 抱歉,但是当我看到一个没有按时间顺序排列的状态(通常是日期)的实体时,我更愿意保留主实体上的最后一个状态:失败 [1/0]。所以也许这很有意义,问题是忘记将摘要作为一个实体(将 Id 列整合,但不整合为失败实体中的 Id)。总结以后可以简单的pojo。你觉得呢?
  • @MontassarElBéhi 我还是不明白你在说什么。随时提供带有实际代码的要点。同时,我找到了一个令我满意的解决方案。

标签: java spring jpa spring-data-jpa jpa-2.0


【解决方案1】:

JPA 2.0 有 ElementCollection,这正是我正在寻找的。​​p>

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(
        name = "TEST_FAILURE",
        joinColumns = [
            JoinColumn(name = "stepExecutionId", referencedColumnName = "stepExecutionId"),
            JoinColumn(name = "jobExecutionId", referencedColumnName = "jobExecutionId")
        ]
)
var failures: List<TestFailure> = mutableListOf()

@Embeddable
class TestFailure : Serializable {
    @Column(length = 999)
    lateinit var testId: String
    @Column(length = 999)
    var message: String? = null
}

【讨论】:

    【解决方案2】:

    您要求@Embeddable,但它不适用于@OneToMany。 请参阅Mapping Single Table to Embeddable Collection in JPA 了解解决方法

    【讨论】:

    • 我不是要Embeddable。我是说TestFailure 表中的id 只存在因为它是Entity;没有人将id 用于任何事情。能够删除 id 而保留其余部分会更有意义。
    猜你喜欢
    • 2015-06-07
    • 2017-05-22
    • 2015-12-04
    • 1970-01-01
    • 2015-10-20
    • 2012-01-11
    • 1970-01-01
    • 2011-03-10
    • 2015-03-12
    相关资源
    最近更新 更多