Переход в спящий режим: @UniqueConstraint при сопоставлении суперкласса с подклассом

#hibernate #jpa #hibernate-mapping #unique-constraint #javax.persistence

#переход в спящий режим #переход в спящий режим-сопоставление #уникальное ограничение #jpa

Вопрос:

Java EE 7, переход в спящий режим 5.4.21.Окончательный

Почему SubClass наследование SuperClass @UniqueConstraint аннотаций или, более конкретно, почему спящий режим использует SuperClass аннотации при SubClass сопоставлении таблиц?

Как мне переопределить @UniqueConstraint в подклассах?

 @Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table( name = "supTable",
        uniqueConstraints = {
            @UniqueConstraint(  name = "UK_multi_col",
                                columnNames = {"colOne", "colTwo"})
        }
)
public class SuperClass implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(name = "id", unique = true, nullable = false)
    protected Long id;

    @Column(name = "colOne")
    protected Long colOne;

    @Column(name = "colTwo")
    protected Long colTwo;
    ...
}
  

использование одного и того же имени "UK_multi_col" в @UniqueConstraint не переопределяет in SubClass и генерирует два УНИКАЛЬНЫХ ключа в SubClass таблицах. Один уникальный ключ из SuperClass и один из SubClass , где должен быть только один (не включая первичный ключ).

 @Entity
@Table( name = "subTable",
        uniqueConstraints = {
            @UniqueConstraint(  name = "UK_multi_col",
                                columnNames = {"colOne", "colTwo", "colThree"})
        }
)
public class SubClass extends SuperClass {

    @Column(name = "colThree")
    protected Long colThree;
    ...
}
  

Переход в спящий режим сгенерированного кода:

 create table test_subTable (
   id bigint not null,
    colOne bigint,
    colTwo bigint,
    colThree bigint,
    primary key (id)
) engine=InnoDB

create table test_supTable (
   id bigint not null,
    colOne bigint,
    colTwo bigint,
    primary key (id)
) engine=InnoDB

alter table test_subTable
    drop index UK_multi_col    
alter table test_subTable
    add constraint UK_multi_col unique (colOne, colTwo, colThree)
  

следующие четыре строки — это код, сгенерированный SuperClass аннотациями во SubClass время сопоставления:

 alter table test_subTable
    drop index UK_a5tjgjgpmww7otw30iyvmym1m    
alter table test_subTable
    add constraint UK_a5tjgjgpmww7otw30iyvmym1m unique (colOne, colTwo) 
  

продолжение гибернации сгенерированного кода:

 alter table test_supTable
    drop index UK_multi_col
alter table test_supTable
    add constraint UK_multi_col unique (colOne, colTwo)
  

таблицы БД:

 | test_subtable | CREATE TABLE `test_subtable` (
  `id` bigint(20) NOT NULL,
  `colOne` bigint(20) DEFAULT NULL,
  `colTwo` bigint(20) DEFAULT NULL,
  `colThree` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_multi_col` (`colOne`,`colTwo`,`colThree`),
  UNIQUE KEY `UK_a5tjgjgpmww7otw30iyvmym1m` (`colOne`,`colTwo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

| test_suptable | CREATE TABLE `test_suptable` (
  `id` bigint(20) NOT NULL,
  `colOne` bigint(20) DEFAULT NULL,
  `colTwo` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_multi_col` (`colOne`,`colTwo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  

у кого-нибудь есть решение этой проблемы?

Это ошибка спящего режима??

Ответ №1:

После дня поиска и тестирования похоже, что это ошибка спящего режима, тестирование с помощью EclipseLink выдает правильное сопоставление БД. Я отправил отчет об ошибке в спящий режим

см.: HHH-14234 для получения тестовых примеров, файлов проекта EclipseLink и статуса проблемы.

Если кто-нибудь найдет хорошее решение проблемы, пожалуйста, напишите.

ОБНОВЛЕНИЕ: похоже, ошибка исправлена, см.: https://github.com/hibernate/hibernate-orm/pull/3574

ОБНОВЛЕНИЕ: эта проблема будет исправлена в гибернации версии 5.5.0