TL; DR
Add the following to your application.yml
file:
spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Or your application.properties
:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Detailed Answer
As Spring Boot 1.4 release notes states:
SpringNamingStrategy
is no longer used as Hibernate 5.1 has removed
support for the old NamingStrategy
interface. A new
SpringPhysicalNamingStrategy
is now auto-configured which is used in
combination with Hibernate’s default ImplicitNamingStrategy
. This
should be very close to (if not identical) to Spring Boot 1.3
defaults, however, you should check your Database schema is correct
when upgrading.
This new PhysicalNamingStrategy
follows Spring recommended naming conventions. Anyway if you want total control over physical naming, you're better off using the org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
. You can switch to that naming strategy by adding the following to your application.yml
:
spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
The annotation is ignored and the table is created as user_connection
which then causes Spring Social to have a hissy fit.
The apply
method of SpringPhysicalNamingStrategy
is the key to understand this behavior:
private Identifier apply(Identifier name, JdbcEnvironment jdbcEnvironment) {
if (name == null) {
return null;
}
StringBuilder builder = new StringBuilder(name.getText().replace('.', '_'));
for (int i = 1; i < builder.length() - 1; i++) {
if (isUnderscoreRequired(builder.charAt(i - 1), builder.charAt(i),
builder.charAt(i + 1))) {
builder.insert(i++, '_');
}
}
return getIdentifier(builder.toString(), name.isQuoted(), jdbcEnvironment);
}
private boolean isUnderscoreRequired(char before, char current, char after) {
return Character.isLowerCase(before) && Character.isUpperCase(current)
&& Character.isLowerCase(after);
}
It basically replaces any .
and case changes (take a look at isUnderscoreRequired
method) with an underscore.