ValidationException, CriteriaBuilder, CriteriaUpdate, обновление / объединение идентификатора соединения - PullRequest
0 голосов
/ 18 февраля 2020

Я получил это исключение сопоставлено столбцу первичного ключа в базе данных. Обновления не допускаются

Я читал этот вопрос: Объединение объекта, изменение его идентификатора, повторное объединение, причина «сопоставлено столбцу первичного ключа в базе данных. Обновления запрещены» ошибка

Ответ, который я хочу реализовать, похож на { ссылка } на основе этой статьи: 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();

1 Ответ

0 голосов
/ 18 февраля 2020

Согласно JPA spe c

Приложение не должно изменять значение первичного ключа. Это включает в себя не изменение значения изменяемого типа, который является первичным ключом или атрибутом составного первичного ключа.

Таким образом, вы должны предоставить искусственный идентификатор для TableBPK (например, с использованием последовательности), и определите уникальное ограничение для текущего первичного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...