В этой статье рассматриваются различные стратегии именования, предоставляемые 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, являются их собственными. |