gpt4 book ai didi

java - JPA 的持续调用是否区分具有单个 PK 列的实体和具有复合 PK 的实体?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:42 28 4
gpt4 key购买 nike

我们的系统中有两个实体,如下所示:

  • Invoice:[InvoiceID, OrgID] 是表示为 bean 的主键,并使用 @IdClass 注释与 Invoice 相关联

  • WorkflowStates:WorkflowStateId 是使用 @Id 注释定义的主键列。

在这两个实体中,ID 字段(InvoiceID、WorkflowStateId)是使用数据库序列自动生成的。

在新创建的 Invoice 实例上调用 persist 时,当我们将 InvoiceID 设置为 -1 时,该实例将被持久化并正确生成 ID。

但是在 WorkflowStateID 设置为 -1 的新创建的 WorkflowStates 实例上调用 persist 时,persist() 调用会抛出异常:

 org.hibernate.PersistentObjectException: detached entity passed to persist: <Entity Class>

如果 persist() 方法对具有单列作为 PK 的实体和具有复合 PK 的实体的工作方式有任何不同,我在搜索中找不到太多信息。有人对此有更多了解吗?

最佳答案

我认为您遇到此异常是因为您为持久化分配了一个 id,同时您在映射中指定该 id 是自动生成的。

当你执行 persist() 时,hibernate 会假设这个对象已经存在于你的数据库中(基于你的对象已经有一个 Id 的事实)......但事实并非如此。这就是您获得异常的原因。

因此,我建议您删除所有 setId(-1)。 (在持久化对象之前保持 id 为空)

编辑

每当实体具有单个 Id 列或复合 Id 时,hibernate 检测实体是否持久的方式存在一些差异。 (我知道它是因为我查看了代码,但我在文档中没有找到任何内容)。

我建议您在 DefaultPersistEventListener.onPersist 中放置一个断点,看看发生了什么。或者启用 hibernate 调试日志记录并分析它。

关于java - JPA 的持续调用是否区分具有单个 PK 列的实体和具有复合 PK 的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990006/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com