84

I have the following entity defined:

@Entity
@Table(name = "EmailTemplate")
public class EmailTemplate {

Despite the table annotation, I receive java.sql.SQLException: Invalid object name 'email_template'. How can I prevent an entity class such as EmailTemplate being transformed into email_template table name?

Edit:

I'm using Spring Boot: start JPA. From my build.gradle file,

compile("org.springframework.boot:spring-boot-starter-data-jpa")
Jens Schauder
  • 77,657
  • 34
  • 181
  • 348
James
  • 2,876
  • 18
  • 72
  • 116

8 Answers8

88

Spring by default uses org.springframework.boot.orm.jpa.SpringNamingStrategy which splits camel case names with underscore. Try setting spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.EJB3NamingStrategy in application.properties. Check out this and this for more info.

Community
  • 1
  • 1
Predrag Maric
  • 23,938
  • 5
  • 52
  • 68
81

For hibernate v5:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Corey
  • 664
  • 9
  • 18
Enginer
  • 3,048
  • 1
  • 26
  • 22
10

For Spring Boot 2 (checked with 2.2.6.RELEASE) it should be configuration yml file:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

So you could have model like:

@Table(name = "tblDepartments")
public class Department {
    @Id
    @Column(name = "dpID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotEmpty
    @Size(min = 1, max = 25)
    @Column(name = "dpName", length = 25)
    private String name;

and populate tables at startup with data.sql:

INSERT INTO tblDepartments (dpName) VALUES ('Gryffindor');
INSERT INTO tblDepartments (dpName) VALUES ('Hufflepuff');

Also, found that for PostgreSQL additional step is needed:

@Entity
@Table(name = "\"tblEmployees\"")
public class Employee {

    @Id
    @Column(name = "\"empID\"")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotEmpty
    @Size(min = 2, max = 25)
    @Column(name = "\"empName\"", length = 25)
    private String name;

Otherwise, the names at DB will be in lowercase, like tblemployees.

catch23
  • 17,519
  • 42
  • 144
  • 217
4

Use this in your appplication.properties.

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
James Jithin
  • 10,183
  • 5
  • 36
  • 51
nanna dash
  • 41
  • 1
1

Use

spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy
0

There are two most common org.hibernate.boot.model.naming.PhysicalNamingStrategys:

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
# also deprecated in 2.6 in favor of CamelCaseToUnderscoresNamingStrategy
# for removal in 2.8
org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties holds:

private void applyNamingStrategies(Map<String, Object> properties) {
    applyNamingStrategy(properties, AvailableSettings.IMPLICIT_NAMING_STRATEGY, this.implicitStrategy,
            () -> SpringImplicitNamingStrategy.class.getName());
    applyNamingStrategy(properties, AvailableSettings.PHYSICAL_NAMING_STRATEGY, this.physicalStrategy,
            () -> CamelCaseToUnderscoresNamingStrategy.class.getName());
}

so by default CamelCaseToUnderscoresNamingStrategy is in use and you have underscores...

gavenkoa
  • 45,285
  • 19
  • 251
  • 303
-2
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a];     
nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement

Both are required :

implicit-strategy 
physical-strategy
slm
  • 15,396
  • 12
  • 109
  • 124
user8106134
  • 107
  • 1
  • 4
-3

Solved.

Invalid Object Name: Springboot with JPA(SQL server)

In application.yaml/properties specify the

spring.jpa.hibernate.naming.implicit-strategy spring.jpa.hibernate.naming.physical-strategy

jpa: show-sql: false hibernate: ddl-auto: none # Defaults to "none" when NOT in embedded mode naming: implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

user8106134
  • 107
  • 1
  • 4