diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/naming/PhysicalNamingStrategySnakeCaseImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/naming/PhysicalNamingStrategySnakeCaseImpl.java index e6904a72726b..8b8c143a9ee9 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/naming/PhysicalNamingStrategySnakeCaseImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/naming/PhysicalNamingStrategySnakeCaseImpl.java @@ -60,10 +60,17 @@ else if ( name.isQuoted() ) { private String camelCaseToSnakeCase(String name) { final StringBuilder builder = new StringBuilder( name.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++, '_' ); + final char[] copy = builder.toString().toCharArray(); + int builderIndex = 1; + for ( int i = 1; i <= copy.length - 1; i++ ) { + if ( isUnderscoreRequired( + copy[i - 1], + copy[i], + i == copy.length - 1 ? '*' : copy[i + 1] ) // add some fictitious final character + ) { + builder.insert( builderIndex++, '_' ); } + builderIndex++; } return builder.toString(); } @@ -79,6 +86,6 @@ protected Identifier quotedIdentifier(Identifier quotedName) { private boolean isUnderscoreRequired(final char before, final char current, final char after) { return ( isLowerCase( before ) || isDigit( before ) ) && isUpperCase( current ) - && ( isLowerCase( after ) || isDigit( after ) ); + && ( isLowerCase( after ) || isDigit( after ) || after == '*' ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/namingstrategy/CamelCaseToUnderscoresNamingStrategyTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/namingstrategy/CamelCaseToUnderscoresNamingStrategyTest.java index 25e9c2538458..4c18364ae782 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/namingstrategy/CamelCaseToUnderscoresNamingStrategyTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/namingstrategy/CamelCaseToUnderscoresNamingStrategyTest.java @@ -65,19 +65,22 @@ public void testWithWordWithDigitNamingStrategy() { .isEqualTo( "hello3d4" ); assertThat( entityBinding.getProperty( "quoted" ).getSelectables().get( 0 ).getText() ) .isEqualTo( "Quoted-ColumnName" ); + assertThat( entityBinding.getProperty( "wordX" ).getSelectables().get( 0 ).getText() ) + .isEqualTo( "word_x" ); } @Entity @Table(name = "ABCD") - class B implements java.io.Serializable { + private static class B implements java.io.Serializable { @Id - protected String AbcdEfghI21; - protected String wordWithDigitD1; - protected String hello1; - protected String hello1D2; - protected String hello3d4; + private String AbcdEfghI21; + private String wordWithDigitD1; + private String hello1; + private String hello1D2; + private String hello3d4; @Column(name = "\"Quoted-ColumnName\"") - protected String quoted; + private String quoted; + private String wordX; public String getAbcdEfghI21() { return AbcdEfghI21;