Ответ 1
Вот пример, который показывает различия между этими четырьмя стратегиями именования (используется Hibernate 5.2.11.RELEASE
).
Java-классы
@Entity
@Table(name = "mainTable")
public class MainEntity {
@Id
private Long id;
@ElementCollection
Set<EmbeddableElement> mainElements;
@OneToMany(targetEntity = DependentEntity.class)
Set<DependentEntity> dependentEntities;
@OneToOne(targetEntity = OwnedEntity.class)
OwnedEntity ownedEntity;
}
@Entity
@Table(name = "dependentTable")
public class DependentEntity {
@Id
private Long id;
@ManyToOne
MainEntity mainEntity;
@ElementCollection
@CollectionTable(name = "dependentElements")
Set<EmbeddableElement> dependentElements;
}
@Entity(name = "'owned_table'")
public class OwnedEntity {
@Id
private Long id;
@ElementCollection
@CollectionTable
Set<EmbeddableElement> ownedElements;
}
@Embeddable
public class EmbeddableElement {
@Column(name = "'quotedField'")
String quotedField;
@Column
String regularField;
}
Сгенерированные DDL
ImplicitNamingStrategyJpaCompliantImpl
Стратегия именования по умолчанию. Реализация контракта ImplicitNamingStrategy, как правило, предпочитающего соответствовать стандартам JPA.
create table main_table
(id bigint not null, "owned_entity_id" bigint, primary key (id))
create table main_entity_main_elements
(main_entity_id bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
create table main_table_dependent_table
(main_entity_id bigint not null, dependent_entities_id bigint not null, primary key (main_entity_id, dependent_entities_id))
create table dependent_table
(id bigint not null, main_entity_id bigint, primary key (id))
create table dependent_elements
(dependent_entity_id bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
create table "owned_table"
(id bigint not null, primary key (id))
create table "'owned_table'_owned_elements"
("'owned_table'_id" bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
ImplicitNamingStrategyLegacyHbmImpl
Реализует оригинальное устаревшее поведение именования.
Основные отличия от стратегии по умолчанию:
- Имена сущностей (см. OwnedEntity)
- Основные имена столбцов (см. MainEntity.ownedEntity)
- Объединить имена таблиц (см. OwnedEntity.ownedElements)
- Объединить имена столбцов (см. MainEntity.dependentEntities)
- Названия в кавычках (см. MainEntity.ownedEntity, OwnedEntity, OwnedEntity.ownedElements)
create table main_table
(id bigint not null, owned_entity bigint, primary key (id))
create table main_entity_main_elements
(main_entity_id bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
create table main_table_dependent_entities
(main_entity_id bigint not null, dependent_entities bigint not null, primary key (main_entity_id, dependent_entities))
create table dependent_table
(id bigint not null, main_entity bigint, primary key (id))
create table dependent_elements
(dependent_entity_id bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
create table owned_entity
(id bigint not null, primary key (id))
create table owned_entity_owned_elements
(owned_entity_id bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
ImplicitNamingStrategyLegacyJpaImpl
Реализация контракта ImplicitNamingStrategy, который соответствует правилам именования, изначально реализованным в Hibernate для JPA 1.0, прежде чем многое выяснится.
Основные отличия от стратегии по умолчанию:
- Объединить имена таблиц (см. MainEntity.dependentEntities)
- Объединить имена столбцов (см. MainEntity.mainElements)
- Имена таблиц в кавычках (см. OwnedEntity.ownedElements)
create table main_table
(id bigint not null, "owned_entity_id" bigint, primary key (id))
create table main_table_main_elements
(main_table_id bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
create table main_table_dependent_table
(main_table_id bigint not null, dependent_entities_id bigint not null, primary key (main_table_id, dependent_entities_id))
create table dependent_table
(id bigint not null, main_entity_id bigint, primary key (id))
create table dependent_elements
(dependent_table_id bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
create table "owned_table"
(id bigint not null, primary key (id))
create table "owned_table_owned_elements"
("owned_table_id" bigint not null, "quoted_field" varchar(255), regular_field varchar(255))
ImplicitNamingStrategyComponentPathImpl
Реализация ImplicitNamingStrategy, которая использует полные составные пути, извлеченные из AttributePath, а не только часть свойства терминала.
Основное отличие от стратегии по умолчанию:
- Имена атрибутов (см. MainEntity.mainElements.regularField)
create table main_table
(id bigint not null, "owned_entity_id" bigint, primary key (id))
create table main_entity_main_elements
(main_entity_id bigint not null, "quoted_field" varchar(255), main_elements_regular_field varchar(255))
create table main_table_dependent_table
(main_entity_id bigint not null, dependent_entities_id bigint not null, primary key (main_entity_id, dependent_entities_id))
create table dependent_table
(id bigint not null, main_entity_id bigint, primary key (id))
create table dependent_elements
(dependent_entity_id bigint not null, "quoted_field" varchar(255), dependent_elements_regular_field varchar(255))
create table "owned_table"
(id bigint not null, primary key (id))
create table "'owned_table'_owned_elements"
("'owned_table'_id" bigint not null, "quoted_field" varchar(255), owned_elements_regular_field varchar(255))