Конфигурация на стратегия за именуване Hibernate 5

1. Общ преглед

Hibernate 5 предоставя две различни стратегии за именуване за използване с Hibernate обекти: имплицитна стратегия за именуване и физическа стратегия за именуване.

В този урок ще видим как да конфигурираме тези стратегии за именуване, за да съпоставим обекти с персонализирани имена на таблици и колони.

За читатели, които са нови за Hibernate, не забравяйте да разгледате нашата статия за въвеждане тук.

2. Зависимости

Ще използваме основната зависимост на Hibernate Core за този урок:

 org.hibernate hibernate-core 5.3.6.Final 

3. Имплицитна стратегия за именуване

Hibernate използва логическо име, за да съпостави име на обект или атрибут с име на таблица или колона. Това име може да бъде персонализирано по два начина : може да бъде извлечено автоматично чрез използване на ImplicitNamingStrategy или може да бъде дефинирано изрично с помощта на анотации .

В ImplicitNamingStrategy урежда начина на хибернация произтича логично име от нашите имена Java класа и собственост. Можем да избираме от четири вградени стратегии или да създадем свои собствени.

За този пример ще използваме стратегията по подразбиране ImplicitNamingStrategyJpaCompliantImpl. Използвайки тази стратегия, логическите имена ще бъдат същите като нашите класове Java и имена на свойства.

Ако искаме да се отклоним от тази стратегия за конкретен обект, можем да използваме анотации, за да направим тези персонализации . Можем да използваме анотацията @Table, за да персонализираме името на @Entity . За свойство можем да използваме анотацията @Column :

@Entity @Table(name = "Customers") public class Customer { @Id @GeneratedValue private Long id; private String firstName; private String lastName; @Column(name = "email") private String emailAddress; // getters and setters }

Използвайки тази конфигурация, логическите имена за обекта на клиента и неговите свойства ще бъдат:

Customer -> Customers firstName -> firstName lastName -> lastName emailAddress -> email

4. Стратегия за физическо именуване

Сега, когато конфигурирахме нашите логически имена, нека да разгледаме нашите физически имена.

Hibernate използва стратегията за физическо име, за да съпостави логическите ни имена в SQL таблица и нейните колони.

По подразбиране физическото име ще бъде същото като логическото име, което сме посочили в предишния раздел . Ако искаме да персонализираме физическите имена, можем да създадем персонализиран клас PhysicalNamingStrategy .

Например, може да искаме да използваме имена на камили в нашия Java код, но искаме да използваме имена, разделени с долна черта, за действителните ни имена на таблици и колони в базата данни.

Сега бихме могли да използваме комбинация от анотации и персонализирана ImplicitNamingStrategy, за да картографираме тези имена правилно, но Hibernate 5 предоставя PhysicalNamingStrategy като начин за опростяване на този процес. Той взема нашите логически имена от предишния раздел и ни позволява да ги персонализираме на едно място.

Нека да видим как се прави това.

Първо, ще създадем стратегия, която преобразува имената на нашите камили, за да използва по-стандартния ни SQL формат:

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy { @Override public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) { return convertToSnakeCase(identifier); } @Override public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) { return convertToSnakeCase(identifier); } @Override public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) { return convertToSnakeCase(identifier); } @Override public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) { return convertToSnakeCase(identifier); } @Override public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) { return convertToSnakeCase(identifier); } private Identifier convertToSnakeCase(final Identifier identifier) { final String regex = "([a-z])([A-Z])"; final String replacement = "$1_$2"; final String newName = identifier.getText() .replaceAll(regex, replacement) .toLowerCase(); return Identifier.toIdentifier(newName); } }

И накрая, можем да кажем на Hibernate да използва новата ни стратегия:

hibernate.physical_naming_strategy=com.baeldung.hibernate.namingstrategy.CustomPhysicalNamingStrategy

Използвайки новата ни стратегия срещу обекта на клиента , физическите имена ще бъдат:

Customer -> customers firstName -> first_name lastName -> last_name emailAddress -> email

5. Заключение

В тази бърза статия научихме връзката между неявните и физическите стратегии за именуване.

Видяхме също как да персонализираме неявните и физически имена на обект и неговите свойства.

Можете да видите изходния код за този урок на Github.