I created Spring Boot 1.3.5 POC with Spring JPA and Hibernate data (4.3.11.Final in this version of Spring Boot). My backend database is Microsoft SQL Server, and our standard naming convention for database objects is a pascal case (e.g. MySchema.MyTable.MyColumn). I used the javax.persistence.Table and javax.persistence.Column annotations to set the names and added spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.EJB3NamingStrategy to the application.properties file.
Everything worked perfectly. I even upgraded to Spring Boot 1.3.6 without any problems.
Now I switched to Spring Boot 1.4.0.RELEASE, which uses Hibernate 5.0.9.Final, and the spring.jpa.hibernate.naming-strategy property is deprecated in favor of spring.jpa. hibernate.naming.strategy. I changed this property name, but left the value EJB3NamingStrategy. I also changed other obsolete elements:
- org.springframework.boot.orm.jpa.EntityScan to org.springframework.boot.autoconfigure.domain.EntityScan
- org.springframework.boot.context.web.SpringBootServletInitializer to org.springframework.boot.web.support.SpringBootServletInitializer
- org.springframework.boot.test.SpringApplicationConfiguration to org.springframework.boot.test.context.SpringBootTest (in my test classes)
Now the created SQL uses the default camel case to emphasize the naming convention, not the pascal case I had with EJB3NamingStrategy.
spring.data.jpa.repositories.enabled=true
spring.data.solr.repositories.enabled=false
spring.data.mongodb.repositories.enabled=false
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.EJB3NamingStrategy
#spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.EJB3NamingStrategy
hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
hibernate.format_sql=true
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Entity
@Table(name="Principal", schema="Security")
@Audited
@AuditTable(value = "Principal", schema = "Audit")
public class Principal {
private static final Logger LOG = LoggerFactory.getLogger(Principal.class);
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "Id",
nullable = false)
private Long id;
@Column(name = "Username",
nullable = false,
unique = true)
@Size(min = 1, max = 64)
private String name;
@Column(name = "FirstName",
nullable = false)
@Size(min = 1, max = 64)
private String firstName;
@Column(name = "LastName",
nullable = false)
@Size(min = 1, max = 128)
private String lastName;
@Column(name = "IsEnabled",
nullable = false)
private boolean enabled;
}
:
Hibernate:
select
principal0_.Id as Id1_8_,
principal0_.IsEnabled as IsEnable2_8_,
principal0_.FirstName as FirstNam3_8_,
principal0_.LastName as LastName4_8_,
principal0_.Username as Username5_8_
from
Security.Principal principal0_
where
principal0_.Username=?
:
Hibernate:
select
principal0_.id as id1_7_,
principal0_.is_enabled as is_enabl2_7_,
principal0_.first_name as first_na3_7_,
principal0_.last_name as last_nam4_7_,
principal0_.username as username5_7_
from
security.principal principal0_
where
principal0_.username=?
2016-08-05 09:19:22.751 WARN 5032
2016-08-05 09:19:22.751 ERROR 5032
2016-08-05 09:19:22.768 ERROR 5032
ImplicitNamingStrategy PhysicalNamingStrategy; , , , , , . NamingStrategy. , ?
Hibernate 5, , @Table @Column?
, ?