#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