当前位置: 首页 > 面试题库 >

在Hibernate 5中实现NamingStrategy(将自动生成的列名设置为大写)

盖博简
2023-03-14
问题内容

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

过去,这种做法过去一直有效,现在我用大写和小写字母弄乱了列名。

我启用了

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

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

根据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是一个内置策略,对于某些应用程序可能是一个有用的起点。

但是在Hibernate 5.0.6中似乎不再有Configuration.setNamingStrategy()了。

我当然想以编程方式进行此操作(我没有.xml配置文件,也不需要它们)。

注意:

使用

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

效果不佳,似乎被完全忽略了…


问题答案:

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。



 类似资料:
  • 问题内容: 我需要让Hibernate从实体开始自动生成数据库,但是我希望它们全部大写。 过去,这种做法过去一直有效,现在我用大写和小写字母弄乱了列名。 我启用了 为了让Hibernate自动生成数据库,我创建了一个UpperorgNamingStrategy.java扩展了 org.hibernate.cfg.ImprovedNamingStrategy 。 根据https://docs.jbo

  • 我启用了 为了让Hibernate自动生成数据库,我创建了一个UpperCaseNamingStrategy.java扩展org.Hibernate.cfg.PromedNamingStrategy。 根据https://docs.jboss.org/hibernate/orm/5.0/manual/en-us/html_single/#configuration-namingstrategy 在

  • org.hibernate.cfg.NamingStrategy 接口允许你为数据库中的对象和 schema 元素指定一个“命名标准”。 你可能会提供一些通过 Java 标识生成数据库标识或将映射定义文件中"逻辑"表/列名处理成"物理"表/列名的规则。这个特性有助于减少冗长的映射定义文件,消除重复内容(如 TBL_ 前缀)。Hibernate 使用的缺省策略是相当精简的。 在加入映射定义前,你可以

  • 我正在尝试使用@ManyToOne和@OneToMany映射实体表。映射列位于名为“internal_plan_id”的子表中。根据要求,我不能更改名称。下面是两个实体表:父表 儿童桌: 我得到错误为:错误:关系“financial_plan_subplan”的列“internal_plan_id_internal_plan_id”不存在。 financial_subplan中用于映射的现有列名是

  • 我有一个WPF Datagrid绑定到一个DataSet;列是自动生成的。我需要将数字列向右对齐。我可以使用一个转换器,就像我在网上找到的这个例子: 但是在我的例子中,列是自动生成的,所以我不能使用 我不知道该怎么处理财产 任何解决方案?

  • 问题内容: 我想将用户持久保存到数据库中,并使用IDENTITY生成类型创建的User的ID(PK)的当前方案。例如 但我想在以下情况下进行操作:1)用户明确设置。2)如果未设置用户,则将自动分配它,并且它必须是唯一的。 请建议我一些可用的选项,以便我解决。谢谢。 问题答案: 您可以为此目的定义您的自定义ID生成器,如本SOAnswer中指出的那样 它的代码如下所示: 和