У меня есть класс сущности с составным первичным ключом, который выглядит так:
@Entity
@Table(schema = "ANYBODY", name = "PERSON")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@EmbeddidId
private PersonPK personPk;
@Column(name = "FIRST_NAME")
private firstName;
@Column(name = "LAST_NAME")
@Column lastName;
}
... и класс составного первичного ключа:
@Embeddable
@Data
@NoArgsConstructor
public class PersonPK implments Serializable {
@NotNull
@Column(columnDefinition = "CHAR(4 BYTE)", name = "NICK_NAME")
private String nickname;
@NotNull
@Column(name = "AGE")
private Integer age;
}
Моя Oracle база данных Схема выглядит следующим образом:
CREATE TABLE ANYBODY.PERSON
(
FIRST_NAME VARCHAR2(30 BYTE) NOT NULL
, LAST_NAME VARCHAR2(30 BYTE) NOT NULL
, AGE NUMBER NOT NULL
, NICK_NAME CHAR(4 BYTE) NOT NULL
);
ALTER TABLE ANYBODY.PERSON ADD CONSTRAINT PERSON PRIMARY KEY
(
AGE
, NICK_NAME
);
Я обнаружил, что могу использовать метод JPA save()
для создания новой строки с сущностью, которая выглядит следующим образом: new Person(new PersonPK("Bud", 40), "Nathan", "Reed")
Однако, если я попытаюсь используйте save () для обновления строки с: new Person(new PersonPK("Bud", 40), "Nate", "Reed")
, я получаю org.hibernate.exception.ConstraintViolationException; java. sql .SQLIntegrityConstraintViolationException: ORA-00001: уникальное ограничение (ANYBODY.PERSON) нарушено
Если я создаю новую строку с использованием JPA save()
с сущностью, которая выглядит следующим образом: new Person(new PersonPK("Lily", 40), "Lilia", "Millar")
(обратите внимание, что свойство псевдонима в первичном ключе теперь имеет строковое значение длины 4), я могу использовать JPA save () для обновления строки в базе данных Oracle без каких-либо проблем. Я думаю, что это как-то связано с тем, что я определил столбец с типом CHAR(4 BYTE)
, но я не понимаю, почему я могу использовать JPA save()
для создания строки со значением для столбца NICK_NAME длина строки 3, но я не могу использовать JPA save()
для обновления этой строки.
Итак. Почему я не могу использовать JPA save()
для обновления строки значением строки длиной 3, если тип столбца таблицы в базе данных Oracle равен CHAR(4 BYTE)
?