Configuração da estratégia de nomeação do Hibernate 5
1. Visão geral
O Hibernate 5 fornece duas estratégias de nomeação diferentes para uso com entidades do Hibernate: uma estratégia de nomeação implícita e uma estratégia de nomeação física.
Neste tutorial, veremos como configurar essas estratégias de nomenclatura para mapear entidades para tabelas personalizadas e nomes de colunas.
Para leitores que são novos no Hibernate, certifique-se de verificar nossointroduction article here.
2. Dependências
Usaremosbasic Hibernate Core dependency para este tutorial:
org.hibernate
hibernate-core
5.3.6.Final
3. Estratégia de nomenclatura implícita
O Hibernate usa um nome lógico para mapear um nome de entidade ou atributo para um nome de tabela ou coluna. Este nomecan be customized in two ways: pode ser derivado automaticamente usando umImplicitNamingStrategy ou pode ser definido explicitamente usando anotações.
OImplicitNamingStrategy governa como o Hibernate deriva um nome lógico de nossa classe Java e nomes de propriedade. We can select from four built-in strategies, or we can create our own.
Para este exemplo, usaremos a estratégia padrão,ImplicitNamingStrategyJpaCompliantImpl.. Usando esta estratégia, os nomes lógicos serão os mesmos de nossa classe Java e nomes de propriedade.
If we want to deviate from this strategy for a specific entity, we can use annotations to make those customizations. Podemos usar a anotação@Table para personalizar o nome de um@Entity. Para uma propriedade, podemos usar a anotação@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
}
Usando essa configuração, os nomes lógicos para a entidadeCustomer e suas propriedades seriam:
Customer -> Customers
firstName -> firstName
lastName -> lastName
emailAddress -> email
4. Estratégia de Nomenclatura Física
Agora que configuramos nossos nomes lógicos, vamos dar uma olhada em nossos nomes físicos.
O Hibernate usa a Estratégia de Nomeação Física para mapear nossos nomes lógicos para uma tabela SQL e suas colunas.
By default, the physical name will be the same as the logical name que especificamos na seção anterior. Se quisermos personalizar os nomes físicos, podemos criar uma classePhysicalNamingStrategy personalizada.
Por exemplo, podemos querer usar nomes de maiúsculas e minúsculas em nosso código Java, mas queremos usar nomes separados por sublinhado para nossos nomes reais de tabela e coluna no banco de dados.
Agora, poderíamos usar uma combinação de anotações e umImplicitNamingStrategy customizado para mapear esses nomes corretamente, mas o Hibernate 5 fornece oPhysicalNamingStrategy como uma forma de simplificar este processo. Ele pega nossos nomes lógicos da seção anterior e nos permite personalizá-los em um só lugar.
Vamos ver como isso é feito.
Primeiro, vamos criar uma estratégia que converte nossos nomes de caso de camelo para usar nosso formato SQL mais padrão:
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);
}
}
Finalmente, podemos dizer ao Hibernate para usar nossa nova estratégia:
hibernate.physical_naming_strategy=com.example.hibernate.namingstrategy.CustomPhysicalNamingStrategy
Usando nossa nova estratégia em relação à entidadeCustomer, os nomes físicos seriam:
Customer -> customers
firstName -> first_name
lastName -> last_name
emailAddress -> email
5. Conclusão
Neste artigo rápido, aprendemos a relação entre as estratégias de nomenclatura implícita e física.
Também vimos como personalizar os nomes implícitos e físicos de uma entidade e suas propriedades.
Você pode visualizar o código-fonte deste tutorialover on Github.