我正在构建电子元件的数据库系统。不幸的是,使用我的一些表的其他程序需要在列名中有空格。我已经在我的hbm.xml文件中试过了这样的属性:
...
property name =“partGroup”column =“part group”type =“string”
...
当然hibernate不会创建具有该列名的表。
有没有办法使用hibernate?
谢谢:]
答案 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)
我已经解决了这个问题如下:
我创建了以下类:
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)+"`"; }
我之前已将“MysqlAdvancedNamingStrategy”设置为namingStrategy。
此解决方案的优点是您无需修改代码中的所有注释。
它也是一个干净的解决方案,因为出于某种原因你可能想要一个应用程序在两个不同的“数据库”中访问相同的数据库“逻辑”(所以有两种类型的转义),用这个解决方案你可以拦截什么数据库你在使用,你可以在“执行时”更改转义策略,但是注释会在“编译时”进行评估。
如果您使用Spring框架,这也是一个干净的解决方案,通过在id="namingStrategy"
和class="util.MysqlAdvancedNamingStrategy"
会话工厂中设置bean,您可以在不触及Java代码的情况下更改转义策略。