Set the table name in the Spring JPA

I guess what I'm trying to do something very simple. Using Spring Boot (1.3.3.RELEASE) with JPA, I want to set the table name.

@Entity @Table(name = "MyTable_name") public class MyTableData { ... } 

What I expect in my database, - a table with the name "MyTable_name". It seems quite reasonable to me. But this does not happen. I get a table named "MY_TABLE_NAME" (H2 backend) or "my_table_name" (Postgre backend). From here I'll stick Postgre, since my goal - to read an existing database, where I do not control the names of the tables.

After some research, I find posts that say I should use the spring.jpa.hibernate.naming-strategy property. It does not help much. Setting up the most frequently recommended org.hibernate.cfg.ImprovedNamingStrategy produces the same behavior: "my_table_name". Adjusting for org.hibernate.cfg.EJB3NamingStrategy creates "mytable_name". Tuning in org.hibernate.cfg.DefaultNamingStrategy errors in Spring application context of internal files.

Resigned to writing my own, I started looking at org.hibernate.cfg.ImprovedNamingStrategy. I have found that using an outdated org.hibernate.cfg.NamingStrategy. It involves the use of NamingStrategyDelegator. I looked at the Java the docs , but not sure how to apply. I found this post . How much I appreciate the explanation, it is trying to do, it is more complicated than what I need and I have had problems with its use.

Now my question is: how do I get Spring JPA only name that I specify? Is there a new property for NamingStrategyDelegator? Do I need to write your own strategy?

=========== Update ==========================

I think I'm going to answer. I created a simple app to download Spring (apart from my project). I use the H2 to the database.

This discussion on Hiberate 5 Naming very helpful. With it, I figured out how to set the naming strategy Hibernate 5 as follows (in application.properties).

 hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

I created the physical strategy of naming, which has gone through a name (for example, org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl) and displays the value. From this I see that the names of the tables - this is what I want, through the physical layer naming.

Then I set the hibernate.show_sql = true, to show the generated SQL. The names of the generated SQL is also true.

I study table names using DatabaseMetaData.

 private void showTables() throws SQLException { DatabaseMetaData dbMetadata = getConnection().getMetaData(); ResultSet result = dbMetadata.getTables(null, null, null, new String[] { "TABLE" }); if (result != null) { boolean haveTable = false; while (result.next()) { haveTable = true; getLogger().info("Found table {}", result.getString("TABLE_NAME")); } if (!haveTable) { getLogger().info("No tables found"); } } } (); private void showTables() throws SQLException { DatabaseMetaData dbMetadata = getConnection().getMetaData(); ResultSet result = dbMetadata.getTables(null, null, null, new String[] { "TABLE" }); if (result != null) { boolean haveTable = false; while (result.next()) { haveTable = true; getLogger().info("Found table {}", result.getString("TABLE_NAME")); } if (!haveTable) { getLogger().info("No tables found"); } } } , null, new String [] { "TABLE"}); private void showTables() throws SQLException { DatabaseMetaData dbMetadata = getConnection().getMetaData(); ResultSet result = dbMetadata.getTables(null, null, null, new String[] { "TABLE" }); if (result != null) { boolean haveTable = false; while (result.next()) { haveTable = true; getLogger().info("Found table {}", result.getString("TABLE_NAME")); } if (!haveTable) { getLogger().info("No tables found"); } } } table {}", result.getString ( "TABLE_NAME")); private void showTables() throws SQLException { DatabaseMetaData dbMetadata = getConnection().getMetaData(); ResultSet result = dbMetadata.getTables(null, null, null, new String[] { "TABLE" }); if (result != null) { boolean haveTable = false; while (result.next()) { haveTable = true; getLogger().info("Found table {}", result.getString("TABLE_NAME")); } if (!haveTable) { getLogger().info("No tables found"); } } } tables found"); private void showTables() throws SQLException { DatabaseMetaData dbMetadata = getConnection().getMetaData(); ResultSet result = dbMetadata.getTables(null, null, null, new String[] { "TABLE" }); if (result != null) { boolean haveTable = false; while (result.next()) { haveTable = true; getLogger().info("Found table {}", result.getString("TABLE_NAME")); } if (!haveTable) { getLogger().info("No tables found"); } } } 

I can still see the names of the tables in ALL CAPS, when I use the code above. This leads me to believe that DatabaseMetaData for some reason shows all caps, but the rest of the code is using the correct names. [EDIT. This conclusion is incorrect. I was just confused everything that happened. Later testing shows that DatabaseMetaData shows the table names with the correct case.]

This is not the complete answer, because in my production code, there is still some kind of oddity that I need to explore. But it's close, and I wanted to publish an update to potential readers do not lose time.

Here is my passage through physical naming strategy in case anyone is interested. I know that it can help to find out what others have done, especially when searching for classes and packages in Spring maze.

 package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } NamingStrategyPhysicalLeaveAlone.class); package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } context) { package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } name: {}", nameText); package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } name: {}", nameText); package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } context) { package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } name: {}", nameText); package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } context) { package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } name: {}", nameText); package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } context) { package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } name: {}", nameText); package my.domain.eric; import java.io.Serializable; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NamingStrategyPhysicalLeaveAlone implements PhysicalNamingStrategy, Serializable { private static final long serialVersionUID = -5937286882099274612L; private static final Logger LOGGER = LoggerFactory.getLogger(NamingStrategyPhysicalLeaveAlone.class); protected Logger getLogger() { return LOGGER; } @Override public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalCatalogName name: {}", nameText); return name; } @Override public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSchemaName name: {}", nameText); return name; } @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalTableName name: {}", nameText); return name; } @Override public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalSequenceName name: {}", nameText); return name; } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { String nameText = name == null ? "" : name.getText(); getLogger().info("toPhysicalColumnName name: {}", nameText); return name; } } 
+5
source share
2 answers

The answer to my question is as follows.

  • SQL is not case sensitive, but it is not so simple. Cited names are taken literally. The identified names may be freely interpreted. For example, PostgreSQL converts unlisted names in lower case, and H2 converts them to upper case. Thus, select * from MyTable_name in PostgreSQL table looking mytable_name. In H2 the same query looks MYTABLE_NAME. In my case, the PostgreSQL table was created using the quoted name "MyTable_name", so select * from MyTable_name to fail while selecting * from "MyTable_name".
  • Spring JPA / Hibernate sends the names without the quotation marks in SQL.
  • In Spring JPA / Hibernate there are three methods which can be used to transmit names quoted
    • Clearly quote the name: @Table (name = "\" MyTable_name \ "")
    • Implement a strategy for the physical name, which cites the names (details below)
    • Ask undocumented attribute to specify all table and column names: spring.jpa.properties.hibernate.globally_quoted_identifiers = true (see. This comment ). That's the last thing I did, because I also have a column name, for which I need sensitivity.

Another source of confusion for me was the fact that many sites are the old variable names hibernate.ejb.naming_strategy or its equivalent Spring. Hibernate to 5, which is outdated. Instead, as I mentioned in my update issue, Hibernate 5 is implicit and physical naming strategy.

Also, I was confused because there are properties of hibernation, and then there are the properties of Spring. I used a very useful guide . However, it shows an unnecessary direct hibernation properties (as I list in my update), and then clear the configuration and LocalContainerEntityManagerFactoryBean JpaTransactionManager. Much easier to use Spring properties and automatically pick them up. For me the important naming strategy.

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

To implement the strategy of naming the physical need to create a class that implements org.hibernate.boot.model.naming.PhysicalNamingStrategy, as I will show in its updated above. Distinguished name is actually very simple, because the Identifier class passed to the method, controls the quotation or not. Thus, the following method will indicate the names of the tables.

 @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { if (name == null) { return null; } return Identifier.quote(name); } context) { @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { if (name == null) { return null; } return Identifier.quote(name); } 

Other things that I found to be useful to someone who came here to find the answers.

  • Using the properties of spring.jpa automatically selects the dialect of SQL. With direct asleep I had a SQL error when I switched to Postgre.
  • Although the Spring application context errors are very common, careful reading of errors often indicate solutions.
  • DatabaseMetaData correctly reported the names of the tables, simply confuse the rest of me.
  • Install spring.jpa.show-sql = true, to see the generated SQL. It is very useful for debugging. Let me see that you are using the correct names of the tables.
  • spring.jpa.hibernate.ddl-auto supports the following minimum values. create-drop: create tables at the entrance, go to the exit. create: create tables at the entrance, but leave at exit. none: Do not create or delete. I saw how people were using "update" as a value, but it has not helped me. (Example here .) Here's a discussion of options .
  • I had problems with the H2, using column names, but did not investigate further.
  • Spring property page is useful, but the descriptions are very sparse.
+3
source

Named in the Entity annotation

 @Entity(name = "MyTable_name") public class MyTableData { ... } 
0
source

All Articles