JPA: как изменить порядок столбцов в первичном ключе

Я использую Spring Data JPA и PostgreSQL 10.

Учитывая классы

@Entity
@Table(name = "test_table")
@IdClass(TestTableId.class)
public class TestTable {
    @Id
    private int b;
    @Id
    private int a;
    private int c;
    // Getters, setters, hashCode() and equals()
}

а также

public class TestTableId implements Serializable {
    private int b;
    private int a;
    // Constructors, getters, setters, hashCode() and equals()
}

В БД таблица создается спящим через

CREATE TABLE test_table
(
    a integer NOT NULL,
    b integer NOT NULL,
    c integer NOT NULL,
    CONSTRAINT test_table_pkey PRIMARY KEY (a, b)
)

Я хочу PRIMARY KEY (a, b) вместо PRIMARY KEY (b, a) по соображениям производительности. Как я могу этого добиться, не переименовывая столбцы?

Спецификация JPA не допускает механизма для определения порядка столбцов в определении схемы. Некоторые провайдеры JPA (например, DataNucleus) позволяют расширение для этого. Не знаю о вашем провайдере. Вы можете просто определить схему самостоятельно.

user8558216 21.03.2018 12:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
1 086
1

Ответы 1

Попробуйте @Embeddable для составных ключей

@Embeddable
public class key implements Serializable {

    private static final long serialVersionUID = 1L;
    @Column(name = "a")
    private String a;
    @Column(name = "b")
    private String b;
}

public class App implements Serializable {

    private static final long serialVersionUID = 1L;
    @EmbeddedId
    private Key id;
}

Это не помогает. Даже если я поменяю местами a и b, я получу CONSTRAINT test_table_pkey PRIMARY KEY (a, b) вместо ... PRIMARY KEY (b, a).

Johannes Flügel 23.03.2018 14:38

Другие вопросы по теме