Grails 3, Hibernate 4.x, HibernateMappingContextConfiguration secondPassCompile . , Hibernate 5, . . graeme grails-:
. Hibernate 5 , . , , . Hibernate 5.2 .
, , Hibernate 5 Grails 3, . :
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.ImplicitForeignKeyNameSource;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
public class ReadableImplicitNamingStrategy extends ImplicitNamingStrategyJpaCompliantImpl {
public static final ReadableImplicitNamingStrategy INSTANCE = new ReadableImplicitNamingStrategy();
private String getPlural(String tableName) {
final int len = tableName.length();
final boolean isLower = Character.isLowerCase(tableName.charAt(len - 1));
final String s = tableName.toLowerCase();
final char lastChar = s.charAt(len - 1);
String result = tableName;
switch (lastChar) {
case 'y':
result = tableName.substring(0, tableName.length() -1) + (isLower? "ie": "IE"); break;
case 's':
case 'x':
case 'z':
result = tableName.substring(0, tableName.length() -1) + (isLower? "e": "E"); break;
default:
if (s.endsWith("sh")) {
result = tableName.substring(0, tableName.length() -1) + (isLower? "e": "E");
}
}
result += (isLower? "s": "S");
return result;
}
@Override
public Identifier determineForeignKeyName(ImplicitForeignKeyNameSource source) {
StringBuilder sb = new StringBuilder("FK_")
.append(source.getReferencedTableName().getText())
.append("_")
.append(getPlural(source.getTableName().getText()));
return toIdentifier(sb.toString(), source.getBuildingContext());
}
}
, Gorm:
import org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration
class GormConfiguration extends HibernateMappingContextConfiguration {
@Override
protected void reset() {
super.reset();
this.implicitNamingStrategy = ReadableImplicitNamingStrategy.INSTANCE;
}
}
, , application.yml , DataSource.
dataSource:
dbCreate: update
configClass: mypackage.GormConfiguration