是否可以使用hibernate创建带有空格的列名?

时间:2010-08-24 14:06:06

标签: java hibernate orm

我正在构建电子元件的数据库系统。不幸的是,使用我的一些表的其他程序需要在列名中有空格。我已经在我的hbm.xml文件中试过了这样的属性:

...

property name =“partGroup”column =“part group”type =“string”

...

当然hibernate不会创建具有该列名的表。

有没有办法使用hibernate?

谢谢:]

2 个答案:

答案 0 :(得分:12)

有一种方法,用反引号括起表名或列名。来自文档:

  

5.4. SQL quoted identifiers

     

你可以强制Hibernate引用一个   生成的SQL中的标识符   将表或列名括在中   映射文档中的反引号。   Hibernate会使用正确的   SQL方言的引用样式。   这通常是双引号,但是   SQL Server使用括号和MySQL   使用反引号。

<class name="LineItem" table="`Line Item`">
    <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="itemNumber" column="`Item #`"/>
    ...
</class>

答案 1 :(得分:0)

我已经解决了这个问题如下:

  1. 我创建了以下类:

    import org.hibernate.cfg.DefaultNamingStrategy;
    
    public class MysqlAdvancedNamingStrategy extends DefaultNamingStrategy{
    
    
    @Override
    public String columnName(String columnName) {
        return "`"+super.columnName(columnName)+"`";
    }
    
    @Override
    public String tableName(String tableName) {
        return "`"+super.tableName(tableName)+"`";
    }
    
    }
  2. 我之前已将“MysqlAdvancedNamingStrategy”设置为namingStrategy。

  3. 此解决方案的优点是您无需修改​​代码中的所有注释。

    它也是一个干净的解决方案,因为出于某种原因你可能想要一个应用程序在两个不同的“数据库”中访问相同的数据库“逻辑”(所以有两种类型的转义),用这个解决方案你可以拦截什么数据库你在使用,你可以在“执行时”更改转义策略,但是注释会在“编译时”进行评估。

    如果您使用Spring框架,这也是一个干净的解决方案,通过在id="namingStrategy"class="util.MysqlAdvancedNamingStrategy"会话工厂中设置bean,您可以在不触及Java代码的情况下更改转义策略。