İki tane naming strategy var. Bunlar ImplicitNamingStrategy ve PhysicalNamingStrategy. Eğer nesnemize bir isim vermediysek, ImplicitNamingStrategy devreye girer ve bir isim üretir. Ancak bu isim veri tabanındaki isim değildir. Hibernate tarafından kullanılan mnatıksa bir isimdir. Bu ismi gerçek veri tabanına dönüştüren şey ise PhysicalNamingStrategy.
Açıklaması şöyle
According to the documentation, there are two interfaces responsible for naming your tables, columns etc. in Hibernate: ImplicitNamingStrategy and PhysicalNamingStrategy.
Aslında bunlar arayüz oldukları için gerçekte kullanılan sınıflar ImplicitNamingStrategyJpaCompliantImpl ve PhysicalNamingStrategyStandardImpl.
Bir de ImplicitNamingStrategyLegacyJpaImpl var. Ancak bu JPA 1.0 için kullanılıyordu.
1. ImplicitNamingStrategy
Açıklaması şöyle. Eğer bir nesneye isim vermezsek bu arayüz devreye girer ve bir isim üretir.
ImplicitNamingStrategy is in charge of naming all objects that were not explicitly named by a developer: e.g. entity name, table name, column name, index, FK etc. The resulting name is called the logical name, it is used internally by Hibernate to identify an object. It is not the name that gets put into the DB.
Örnek
Şöyle yaparız.
spring.jpa.hibernate.naming.physical-strategy=
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Örnek
Şöyle yaparız
spring:jpa:hibernate:naming:physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImplimplicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
Açıklaması şöyle.
PhysicalNamingStrategy provides the actual physical name used in the DB based on the logical JPA object name. Effectively, this means that using Hibernate you cannot specify database object names directly, but only logical ones.
Bu aslında şu anlama geliyor
Effectively, this means that using Hibernate you cannot specify database object names directly, but only logical ones.
Ancak Spring, Hibernate tarafından sağlanan arayüzlere kendi sınıflarını takıyor. Açıklaması şöyle.
Spring Boot overrides Hibernate default implementations for both interfaces and uses SpringImplicitNamingStrategy and SpringPhysicalNamingStrategy instead.
1. SpringImplicitNamingStrategy
Açıklaması şöyle.
Effectively, SpringImplicitNamingStrategy copies the behaviour of ImplicitNamingStrategyJpaCompliantImpl with only a minor difference in join table naming....By default, Spring Boot configures the physical naming strategy with SpringPhysicalNamingStrategy. This implementation provides the same table structure as Hibernate 4: all dots are replaced by underscores and camel casing is replaced by underscores as well. Additionally, by default, all table names are generated in lower case. For example, a TelephoneNumber entity is mapped to the telephone_number table....Basically, it always transforms camelCase and PascalCase to snake_case. In fact, using it isn't possible to work with non_snake_case at all.
Açıklaması şöyle.
By default, Spring Boot configures the physical naming strategy with SpringPhysicalNamingStrategy. Which does this: For example, a TelephoneNumber entity is mapped to the telephone_number table (same goes for columns).
Burada Spring JPA standardından sapıyor ve isimleri snake_case olarak üretiyor. Açıklaması şöyle
The JPA default table name is the name of the class (minus the package) with the first letter capitalized.
2. SpringPhysicalNamingStrategy
Bu yüzden
@Table(name = "PetType") versek bile veri tabanında pet_type isimli tablo oluşur@Table(name = "\"PetType\"") versek bile veri tabanında "pet_type" isimli tablo oluşur
Eğer kendi nesnemizi takmak istersek şöyle yaparız.
Kullanmak için şöyle yaparız.public class UpperCaseNamingStrategy extends SpringPhysicalNamingStrategy {@Overrideprotected Identifier getIdentifier(String name, boolean quoted,
JdbcEnvironment jdbcEnvironment) {return new Identifier(name.toUpperCase(), quoted);}}
spring.jpa.hibernate.naming.physical-strategy=
com.baeldung.namingstrategy.UpperCaseNamingStrategy
Hiç yorum yok:
Yorum Gönder