0

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

我正在阅读这个问题:合并实体,更改其 ID,再次合并,导致“映射到数据库中的主键列。不允许更新”错误

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

我的问题是:

表_A

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

表_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. 怎么做?

实体的Java TableBTable_B

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

ID/PK表BPK

@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();
4

1 回答 1

0

根据 JPA 规范

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

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

于 2020-02-17T21:45:32.327 回答