sarah.ferguson
sarah.ferguson

Reputation: 3257

Implementing a NamingStrategy in Hibernate 5 (make autogenerated column names UPPERCASE)

I need to let Hibernate auto generate the database starting from the entities, however I want them all UPPERCASE.

This used to work in the past now I have messed up column names with Upper and Lower case letters.

I enabled the

.setProperty("hibernate.hbm2ddl.auto", "create") 

to let Hibernate auto generate the database, and I created an UppercaseNamingStrategy.java extending org.hibernate.cfg.ImprovedNamingStrategy.

According to https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html_single/#configuration-namingstrategy

Now I should

You can specify a different strategy by calling Configuration.setNamingStrategy() before adding mappings:

SessionFactory sf = new Configuration()
.setNamingStrategy(ImprovedNamingStrategy.INSTANCE)
.addFile("Item.hbm.xml")
.addFile("Bid.hbm.xml")
.buildSessionFactory();

org.hibernate.cfg.ImprovedNamingStrategy is a built-in strategy that might be a useful starting point for some applications.

Configuration.setNamingStrategy() however seems to be no more in Hibernate 5.0.6.

I would of course like to do it programatically (I don't have .xml configuration files and don't want them).

NOTE:

Using

.setProperty("hibernate.ejb.naming_strategy", "my.project.hibernate.UppercaseNamingStrategy")

doesn't work as well, seems to be ignored altogether...

Upvotes: 3

Views: 3401

Answers (1)

v.ladynev
v.ladynev

Reputation: 19976

Hibernate 5 uses two new interfaces for name strategies PhysicalNamingStrategy and ImplicitNamingStrategy. You need just implement PhysicalNamingStrategy. It is called by Hibernate after all column names are created for model. So you can just make it uppercase. Hibernate uses by default PhysicalNamingStrategyStandardImpl, that do nothing. You can just extend it

public class UpperCaseNamingStrategy extends PhysicalNamingStrategyStandardImpl {

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return context.getIdentifierHelper().toIdentifier(
            StringUtils.upperCase(name.getText(), Locale.ENGLISH));
    }

}

You can build session factory with UpperCaseNamingStrategy by this way

    Configuration configuration = new Configuration();
    configuration.setPhysicalNamingStrategy(new UpperCaseNamingStrategy());
    SessionFactory sessionFactory = configuration.configure().buildSessionFactory(); 

I am working on a more complex name strategy now. You can refer Hibernate5NamingStrategy if you are interested.

Upvotes: 4

Related Questions