java - que - reglas de los identificadores en programacion
Cómo asignar los campos de entidad de Hibernate usando camelCase a los identificadores de base de datos snake_case(guión bajo) (3)
Tengo campos de base de datos en el guión bajo. Tengo campos de entidad en camelcase. No puedo cambiar ninguno de esos.
¿Hay algo, tal vez una anotación de nivel de clase que pueda usar para predeterminar las anotaciones de nombre de columna de entidad al equivalente de camelcase?
por ejemplo, tengo una entidad como esta:
@Entity
public class AuthorisationEntity {
@Column(name = "non_recoverable")
private BigDecimal nonRecoverable;
@Column(name = "supplier_recoverable")
private BigDecimal supplierRecoverable;
@Column(name = "refund_amount")
private BigDecimal refundAmount;
}
Sueño con esto:
@Entity
@DatabaseIsUnderscoreAndThisAnnotationConvertsThemToCamelCaseByDefault
public class AuthorisationEntity {
private BigDecimal nonRecoverable;
private BigDecimal supplierRecoverable;
private BigDecimal refundAmount;
}
Como expliqué en este artículo , puede lograr esto utilizando una estrategia de nombres Hibernate personalizada.
Todo lo que necesita hacer es utilizar el proyecto de código abierto de hibernate-types
.
Hibernate 5.2 o posterior
Debe agregar la siguiente dependencia de Maven:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
Y establece la siguiente propiedad de configuración de Hibernate:
<property name="hibernate.physical_naming_strategy"
value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>
Hibernate 5.0 y 5.1
Debe agregar la siguiente dependencia de Maven:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-5</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
Y establece la siguiente propiedad de configuración de Hibernate:
<property name="hibernate.physical_naming_strategy"
value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>
Hibernate 4.3
Debe agregar la siguiente dependencia de Maven:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-43</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
Y establece la siguiente propiedad de configuración de Hibernate:
<property name="hibernate.ejb.naming_strategy"
value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>
Hibernate 4.2 y 4.1
Debe agregar la siguiente dependencia de Maven:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-4</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
Y establece la siguiente propiedad de configuración de Hibernate:
<property name="hibernate.ejb.naming_strategy"
value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>
Tiempo de prueba
Suponiendo que tiene las siguientes entidades:
@Entity(name = "BookAuthor")
public class BookAuthor {
@Id
private Long id;
private String firstName;
private String lastName;
//Getters and setters omitted for brevity
}
@Entity(name = "PaperBackBook")
public class PaperBackBook {
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE
)
private Long id;
@NaturalId
private String ISBN;
private String title;
private LocalDate publishedOn;
@ManyToOne(fetch = FetchType.LAZY)
private BookAuthor publishedBy;
//Getters and setters omitted for brevity
}
Al usar la estrategia de nomenclatura personalizada CamelCaseToSnakeCaseNamingStrategy
, Hibernate generará el siguiente esquema de base de datos utilizando la herramienta hbm2ddl
:
CREATE SEQUENCE hibernate_sequence
START WITH 1 INCREMENT BY 1
CREATE TABLE book_author (
id BIGINT NOT NULL,
first_name VARCHAR(255),
last_name VARCHAR(255),
PRIMARY KEY (id)
)
CREATE TABLE paper_back_book (
id BIGINT NOT NULL,
isbn VARCHAR(255),
published_on DATE,
title VARCHAR(255),
published_by_id BIGINT,
PRIMARY KEY (id)
)
Genial, ¿verdad?
Puede utilizar la estrategia de nombres de hibernación. Dicha clase de estrategia de nomenclatura describe cómo generar nombres de bases de datos para nombres de Java dados.
Ver:
ejemplo de estrategia de nombres
Muy buena estrategia para nombrar oracle : convierte el camello en una convención de subrayado y mucho más.
import org.hibernate.cfg.DefaultNamingStrategy;
import org.hibernate.cfg.ImprovedNamingStrategy;
public class NamingStratagyTest {
public static void main(String[] args) {
String colName = DefaultNamingStrategy.INSTANCE.columnName("UserName");
System.out.println(colName); // UserName
colName = ImprovedNamingStrategy.INSTANCE.columnName("UserName");
System.out.println(colName);// user_name
}
}
Ahí lo tienes, elige la estrategia de nombres que se adapte a tus necesidades.