Код: Выделить всё
CREATE EXTENSION citext;
CREATE TYPE metadata_type AS ENUM ('STRING', 'DATE', 'INTEGER', 'DOUBLE');
CREATE TABLE metadata
(
id BIGSERIAL PRIMARY KEY,
name CITEXT NOT NULL,
type metadata_type NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
ALTER TABLE metadata
ADD CONSTRAINT metadata_unique_name UNIQUE (name);
[img]https://i. sstatic.net/QSSQoGDn.png[/img]
Затем я создаю объект JPA для этой таблицы:
Код: Выделить всё
@Entity
public class Metadata {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(nullable = false, unique = true)
private String name;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private GalleryMetadataType type;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
[img]https://i.sstatic .net/bZByoeAU.png[/img]
Как видите, типы данных столбцов «имя» и «тип» меняются на varchar. Я могу жить с изменением перечисления на varchar. Но CITEXT не должен меняться на varchar! Это нарушает ограничение уникальности, поскольку теперь и «тест», и «Тест» можно использовать одновременно.
Как я могу запретить JPA изменять типы данных? Или какой класс мне следует использовать вместо String для CITEXT?
Мой обходной путь — использовать varchar вместо CITEXT и создать индекс следующим образом:
Код: Выделить всё
CREATE UNIQUE INDEX metadata_idx_unique_name ON metadata (LOWER(name));
Подробнее здесь: https://stackoverflow.com/questions/790 ... -data-type
Мобильная версия