В этой статье рассматриваются различные стратегии именования, предоставляемые hibernate, а также переход от стратегии именования от hibernate.ejb.naming_strategy в hibernate 4 к hibernate.implicit_naming_strategy и hibernate.physical_naming_strategy в hibernate 5. И в конце мы рассмотрим реализация настраиваемой стратегии именования в спящем режиме и конфигурирование для запуска с приложением Spring
Hibernate 4 Naming Strategy
Hibernate использует эту стратегию для сопоставления сущности java и имени атрибута с соответствующей реляционной базой данных и именем столбцов. В hibernate 4 использовалась стратегия именования hibernate.ejb.naming_strategy. Эта стратегия использует EJB3NamingStrategy , ImprovedNamingStrategy , DefaultComponentSafeNamingStrategy и DefaultNamingStrategy для сопоставления имен. EJB3NamingStrategy — это используемая по умолчанию стратегия именования, которая предоставляет имена полей и таблиц верблюда. При именовании столбца внешнего ключа в качестве разделения используется undescore (_). Например, если у вас есть таблица с именем и таблицей 1 с именами столбцов в качестве идентификатора и имени, то в таблице 2 столбец внешнего ключа будет создан как table1_id, и этот EJB3NamingStrategy реализует интерфейс NamingStrategy.
Hibernate 5 Naming Strategy
После выпуска Hibernate 5 hibernate.ejb.naming_strategy больше не доступен, поскольку контракт NamingStrategy часто был недостаточно гибким, чтобы правильно применять данное «правило» именования. Вместо этого были введены две новые стратегии, обеспечивающие глубокую настройку стратегии именования, и это ImplicitNamingStrategy и PhysicalNamingStrategy. Чтобы использовать эту стратегию, необходимо использовать два ключа implicit_naming_strategy и Physical_Naming_strategy. Hibernate 5 предоставляет только одну реализацию PhysicalNamingStrategy — PhysicalNamingStrategyStandardImpl, но несколько реализаций ImplicitNamingStrategy.
ImplicitNamingStrategy используется, когда вы не предоставляете имя базы данных и столбца явно в определении сущности, где как PhysicalNamingStrategy можно использовать для явного определения правил отображения сущности и имени атрибута с именем базы данных и столбцов.
ImplicitNamingStrategy
ImplicitNamingStrategy используется, когда объект не дает явного имени таблице базы данных, с которой он сопоставляется, или когда конкретный атрибут не дает явного имени столбцу базы данных, к которому он сопоставлен. Мы можем указать, какой ImplicitNamingStrategy использовать, используя параметр конфигурации hibernate.implicit_naming_strategy, который принимает default, jpa, legacy-hbm, legacy-jpa и component-path.
PhysicalNamingStrategy
Идея PhysicalNamingStrategy состоит в том, чтобы определять пользовательские правила именования без необходимости жестко кодировать их в отображении с помощью явных имен. Далее следует реализация PhysicalNamingStrategy для определения пользовательского имени таблицы и имени столбца.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
package com.devglan;import java.util.LinkedList;import java.util.List;import java.util.Locale;import org.hibernate.boot.model.naming.Identifier;import org.hibernate.boot.model.naming.PhysicalNamingStrategy;import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;import org.apache.commons.lang3.StringUtils;public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy { @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) { return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) { return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) { final List parts = splitAndReplace( name.getText() ); return jdbcEnvironment.getIdentifierHelper().toIdentifier( join( parts ), name.isQuoted() ); } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) { return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) { final List parts = splitAndReplace( name.getText() ); return jdbcEnvironment.getIdentifierHelper().toIdentifier( join( parts ), name.isQuoted() ); } private LinkedList splitAndReplace(String name) { LinkedList result = new LinkedList<>(); for ( String part : StringUtils.splitByCharacterTypeCamelCase( name ) ) { if ( part == null || part.trim().isEmpty() ) { continue; } result.add( part.toUpperCase( Locale.ROOT ) ); } return result; } private String join(List parts) { boolean firstPass = true; String separator = ""; StringBuilder joined = new StringBuilder(); for ( String part : parts ) { joined.append( separator ).append( part ); if ( firstPass ) { firstPass = false; separator = "_"; } } return joined.toString(); }} |
Чтобы использовать эту пользовательскую стратегию в режиме гибернации, ниже приведена конфигурация.
|
1
|
jpaProperties.put("hibernate.physical_naming_strategy", "com.devglan.config.CustomPhysicalNamingStrategy"); |
Стратегия именования Hibernate в Spring Boot
Как мы уже говорили, hibernate предоставляет две разные стратегии именования, тогда как Spring Boot конфигурирует физическую стратегию именования с помощью SpringPhysicalNamingStrategy, где все точки заменяются подчеркиванием, а верблюжий корпус заменяется подчеркиванием, а все имена таблиц генерируются в нижнем регистре. Например, объект USERDETAILS отображается в таблицу user_details
Если вы хотите использовать собственную стратегию именования, реализованную выше, вы можете выполнить следующую настройку в файле application.properties.
|
1
|
spring.jpa.hibernate.naming.physical-strategy=com.devglan.config.CustomPhysicalNamingStrategy); |
Вывод
В этой статье мы узнали о различных стратегиях именования, предоставляемых spring boot и hibernate, и о способах реализации нашей собственной стратегии именования. Если у вас есть что-то, что вы хотите добавить или поделиться, пожалуйста, поделитесь этим ниже в разделе комментариев .
| Смотрите оригинальную статью здесь: Различные стратегии именования в Hibernate
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |