Примеры стратегии именования Hibernate 5

В Hibernate реализованы некоторые стандартные стратегии именования:

default
for org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl - an alias for jpa

jpa
for org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl - the JPA 2.0 compliant naming strategy

legacy-hbm
for org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl - compliant with the original Hibernate NamingStrategy

legacy-jpa
for org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl - compliant with the legacy NamingStrategy developed for JPA 1.0, which was unfortunately unclear in many respects regarding implicit naming rules.

component-path
for org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl - mostly follows ImplicitNamingStrategyJpaCompliantImpl rules, except that it uses the full composite paths, as opposed to just the ending property part

Но я не могу найти примеров для каждой стратегии. Вы знаете, где я могу найти такие примеры?

Ответы

Ответ 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))