当前位置: 首页 > 知识库问答 >
问题:

更新嵌套的OneToMany hibernate实体

谢烨烨
2023-03-14

我实现了两个 entites。规则实体和 RestCall 实体如下所示:

RuleEntity

    @Entity(name = "RuleEntity")
    @Table(name = "Rule")
    public class RuleEntity {
    
        @Id
        @Column(name = ID_COLUMN_NAME, nullable = false)
        @GeneratedValue(strategy = AUTO)
        private Long id;

        @Column(name = "name", nullable = false)
        public String name = "";
    
        @OneToMany(targetEntity = RestCallEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
        public final Set<RestCallEntity> restCalls = new HashSet<>();
    }

RestCallEntity

@Entity(name = "RestCallEntity")
@Table(name = "RestCall")
public class RestCallEntity

    @Id
    @Column(name = ID_COLUMN_NAME, nullable = false)
    @GeneratedValue(strategy = AUTO)
    private Long id;

    @Column(name = "name", nullable = false)
    public String name = "";
}

我在 json 终结点中收到一条规则。比我将收到的 json 规则转换为规则实体并调用

getEntityManager().merge(ruleEntity);

当我只是更改规则的名称时,更新工作正常。但是当我更改它的名称时,它看起来像Hibernate尝试创建一个新的重新调用,即使它已经有一个ID。我得到以下异常

原因:ruleentity_id:错误:重复键值违反唯一约束?rule_restcall_pkey?详细信息:键?(org.postgresql.util.PSQLException,restcalls_id)=(45,49)?已经存在。org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675)org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365)org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355)org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490)org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408)org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:166)org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:134)io.agroal.pool.wrapper.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:88)org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)

共有1个答案

董胡媚
2023-03-14

所以我终于想通了,很可能是equals/hashcode方法的实现造成的。我将equals方法更改为只检查id,将hashcode方法更改为只返回id的hashcode。现在更新工作正常。

 类似资料:
  • 我有一个dynamodb表,它的一个属性包含一个嵌套的映射,我想更新一个特定的库存项目,该项目通过一个过滤器表达式进行过滤,从而从该映射中生成一个项目。 如何编写一个更新表达式来更新位置到名称=欧宝的项目的“就位三”,标签包括“x1”(也可能是f3)?这应该只更新第一个列表元素位置属性。

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 我有以下架构 我想为创建静态方法,以便根据给定的更新 我的情况与建议的复制相似,但不相同,因为那里的家伙知道所有的,而我不知道。

  • 这是我的架构:

  • 我有一个目标,它有一个目标清单。一个目标有一系列的策略。一个战略有一个战术清单。战术有一个任务列表。 我希望能够在树视图中显示这一点,我希望树与项目同步。也就是说,如果我删除一个目标,该目标及其子目标也将从TreeView中消失。 计划是创建一个包装PlanItem的TreeItem。然后,将TreeItem的子TreeItems与PlanItem的子PlanItems同步。对于每个嵌套的Plan

  • 我正在尝试更新嵌套数组中的值,但无法使其工作。 我的对象是这样的 提前谢谢!