1. Introduction
Hibernate as an ORM mapping tool maps objects in domain model to the relational model. To do this mapping, Hibernate has to identify which Java object to map with which relational model. ImplicitNamingStrateg
y and PhysicalNamingStrategy
are used to identify how the mapping of names should be done. The mapping of names is done in two stages:
- In the first stage, a logical name is determined from the domain model mapping. You can explicitly specify the logical name using annotations like
@Table
,@Column
. Or it can be implicitly determined by Hibernate usingImplicitNamingStrategy
implementation. - In the second stage, the logical name is resolved to a physical name which is defined by the
PhysicalNamingStrategy
implementation.
Naming strategies definition are very helpful to map domain model to relation model. Sometimes, the names in domain model and relational model are different and if no strategy is defined then you may end up providing the mapping details repeatedly.
2. ImplicitNamingStrategy
You can explicitly provide the name of the table or the column using @Tabl
e and @Column
. When an entity does not explicitly provides the name of the table or column to which it maps, Hibernate implicitly determines the name of the table or column. The Interface used to define this contract is org.hibernate.boot.model.naming.ImplicitNamingStrategy
. There are two ways to do the configuration:
- Using the
hibernate.implicit_naming_strategy
configuration setting. This configuration setting accepts reference or a fully qualified name of a Class that implementsorg.hibernate.boot.model.naming.ImplicitNamingStrategy
. Hibernate has out-of-the-box implementations which can also be used to do configuration. - Using
org.hibernate.boot.MetadataBuilder#applyImplicitNamingStrategy
.
3. PhysicalNamingStrategy
Many organizations have their own rules for naming of database objects like tables, columns, sequences etc. These rules can be hard coded when we define mapping. The other way is to use PhysicalNamingStrategy
. For example, you may want to abbreviate number with num, phone with ph and add certain prefixes like TAB_ to the table names.
In our example, we’ll demonstrate using PhysicalNamingStrategy
by adding prefix “TAB_” for the table name. So if the entity is Employee
, the physical table name will be TAB_Employee
. So configuring PhysicalNamingStrateg
y will help you mapping TAB_
without hard coding in your code.
In hibernate.cfg.xml, we’ll configure hibernate.physical_naming_strategy
property.
<property name="hibernate.physical_naming_strategy">com.learnitweb.util.CustomPhysicalNamingStrategy</property>
Here, CustomPhysicalNamingStrategy
is a class which extends PhysicalNamingStrategyStandardImpl
. We’ll override method toPhysicalTableName
to provide logic for deciding physical name for the table.
package com.learnitweb.util; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class CustomPhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl { @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) { // add prefix TAB_ for the table name return jdbcEnvironment.getIdentifierHelper().toIdentifier("TAB_" + name.getText()); } }