Я получил это исключение сопоставлено столбцу первичного ключа в базе данных. Обновления не допускаются
Я читал этот вопрос: Объединение объекта, изменение его идентификатора, повторное объединение, причина «сопоставлено столбцу первичного ключа в базе данных. Обновления запрещены» ошибка
Ответ, который я хочу реализовать, похож на { ссылка } на основе этой статьи: https://thoughts-on-java.org/criteria-updatedelete-easy-way-to/
Моя проблема is:
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)
Теперь я хочу обновить ( Merge ) priority_B
. Как это сделать?
Java TableB для Table_B
Entity
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();