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; } }