Почему я не могу использовать JPA для обновления строки значением для строки длиной 3, если тип столбца в таблице базы данных Oracle - CHAR (4 BYTE)? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть класс сущности с составным первичным ключом, который выглядит так:

@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)?

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Вы создали PK с AGE и NICK_NAME.

Это означает, что при добавлении новой записи комбинация между age и nick_name должна быть уникальной из других предыдущих записей. Поэтому, вероятно, у вас уже есть ("Bud", 40) в вашей таблице, которая вызывает эту ошибку.

Решения:

  • Попробуйте удалить строку ("Bud", 40) в таблице
  • Измените псевдоним или возраст.
  • Предложение : в этом случае возраст и имя в действительности не сочетаются, поскольку у вас может быть много людей с одинаковым именем и возрастом. Поэтому попробуйте сделать другую комбинацию для вашего PK
0 голосов
/ 11 марта 2020

Символы хранят фиксированное значение длины 1. Все, что вы указываете, это отображаемая длина. Хранить как строку (TEXT, LONGTEXT, VARCHAR), а не как символ.

@Column(columnDefinition = "VARCHAR(4)", name = "NICK_NAME")
0 голосов
/ 11 марта 2020

Вы получаете ошибку из-за того, что Уникальное ограничение нарушено

Итак, эти данные уже существуют new Person(new PersonPK("Bud", 40), "Nathan", "Reed")

Вы уже должны иметь запись для

Псевдоним: Bud

Возраст: 40

Это не проблема 4 байтов

Попробуйте очистить таблицу, затем сделайте запись подтвердить то же самое

...