tipos reglas que programacion predefinidos nomenclatura los identificadores identificador ejemplos datos constantes java hibernate annotations

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?



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.