【问题标题】:ValidationException, CriteriaBuilder, CriteriaUpdate, Update/Merge compound IDValidationException、CriteriaBuilder、CriteriaUpdate、更新/合并复合 ID
【发布时间】:2020-02-17 21:20:30
【问题描述】:

我得到这个异常被映射到数据库中的主键列。不允许更新

我正在阅读这个问题:Merge an entity, change its id, merge again, cause "mapped to a primary key column in the database. Updates are not allowed" error

我想要实现的答案就像https://stackoverflow.com/a/39680764/811293基于这篇文章:https://thoughts-on-java.org/criteria-updatedelete-easy-way-to/

我的问题是:

Table_A

PRODUCT_CODE_A VARCHAR2(10) NOT NULL
...
CONSTRAINT Table_A_PK PRIMARY KEY (PRODUCT_CODE_A) ENABLE

Table_B

PRODUCT_CODE_B VARCHAR2(10) NOT NULL
PRIORITY_B INTEGER NOT NULL 
...
CONSTRAINT Table_B_FK FOREIGN KEY (PRODUCT_CODE_B) REFERENCES Table_A (PRODUCT_CODE_A)
CONSTRAINT Table_B_PK PRIMARY KEY (PRODUCT_CODE_B, PRIORITY_B)

现在我想更新(合并priority_B。 怎么做?

Table_B 实体的 Java TableB

public class TableB implements Serializable {
    ...
    @EmbeddedId
    protected TableBPK tableBPK;
    ...
}

ID/PK TableBPK

@Embeddable
public class TableBPK implements Serializable {
    ...
    @Basic(optional = false)
    @Column(name = "PRODUCT_CODE_B")
    private String productCodeB;
    @Basic(optional = false)
    @Column(name = "PRIORITY_B")
    private Long priorityB; 
    ...
}

我的失败代码:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaUpdate<TableB> criteriaUpdate = criteriaBuilder.createCriteriaUpdate(TableB.class);
Root<TableB> root = criteriaUpdate.from(TableB.class);

criteriaUpdate
    .set(OldTableB.tableBPK.priorityB, newId) // HOW TO DO THIS?
    .where(criteriaBuilder.equal(root.get(OldTableB.tableBPK.priorityB), oldId)); // HOW TO DO THIS?

entityManager.createQuery(criteriaUpdate).executeUpdate();

【问题讨论】:

    标签: jpa java-8 sql-update compound-key


    【解决方案1】:

    根据 JPA 规范

    应用程序不得更改主键的值。这包括不更改作为主键或复合主键属性的可变类型的值。

    因此,您应该在 TableBPK 上提供一个人工 id(例如使用序列),并为当前主键定义一个唯一约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2016-05-13
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      相关资源
      最近更新 更多