在Hibernate 5中实现NamingStrategy(使自动生成的列名称为UPPERCASE)

时间:2016-01-22 15:08:57

标签: java hibernate jpa

我需要让Hibernate从实体开始自动生成数据库,但是我希望它们都是UPPERCASE。

过去曾经工作过,现在我用大写和小写字母混淆了列名。

我启用了

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

让Hibernate自动生成数据库,我创建了一个扩展 org.hibernate.cfg.ImprovedNamingStrategy 的UppercaseNamingStrategy.java。

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

现在我应该

  

您可以通过调用指定其他策略   添加映射之前的Configuration.setNamingStrategy():

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

org.hibernate.cfg.ImprovedNamingStrategy是一种内置策略   可能是某些应用程序的有用起点。

然而,

Configuration.setNamingStrategy()似乎不再是Hibernate 5.0.6。

我当然喜欢以编程方式(我没有.xml配置文件而不想要它们)。

注意:

使用

.setProperty(“hibernate.ejb.naming_strategy”,“my.project.hibernate.UppercaseNamingStrategy”)

不起作用,似乎完全被忽略了......

1 个答案:

答案 0 :(得分:2)

Hibernate 5使用两个新接口来实现名称策略PhysicalNamingStrategyImplicitNamingStrategy。您只需实施PhysicalNamingStrategy即可。在为模型创建所有列名后,由Hibernate调用它。所以你可以把它做成大写。 Hibernate默认使用PhysicalNamingStrategyStandardImpl,它什么都不做。你可以扩展它

public class UpperCaseNamingStrategy extends PhysicalNamingStrategyStandardImpl {

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

}

您可以通过这种方式使用UpperCaseNamingStrategy构建会话工厂

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

我正在制定一个更复杂的名称策略。如果您有兴趣,可以参考Hibernate5NamingStrategy