有一个Hibernate 3.5.2应用程序,我希望能够连接到Postgres或Oracle。这两个模式类似,但在Oracle中,表和列名称被切割为最多30个字符。类名和类属性名称遵循Postgres表和列名称。在“HibernateUtil.java”中,配置读取.xml文件,然后检查连接URL,如果是Oracle,则会发生表和列名称映射:
Iterator<Table> tableIterator = configuration.getTableMappings();
while (tableIterator.hasNext()) {
Table table = tableIterator.next();
if (table.getName().length() > 30) {
table.setName(table.getName().substring(0, 30));
}
Iterator<Column> columnIterator = table.getColumnIterator();
while (columnIterator.hasNext()) {
Column column = columnIterator.next();
if (column.getName().length() > 30) {
column.setName(column.getName().substring(0, 30));
}
}
}
configuration.buildMappings();
然后打开会话。
除其他外,还有“table_a”和“table_b”,“table_b”有一列引用“table_a”的主键。
“TableA.hbm.xml”看起来像:
...
<set name="tableB" table="table_b" inverse="true" lazy="true" fetch="select">
<key>
<column name="refid_with_long_name_more_than_30_chars" not-null="true" />
</key>
<one-to-many class="blabla" />
</set>
...
“TableB.hbm.xml”如下所示:
...
<many-to-one name="tableA" class="blabla" fetch="select">
<column name="refid_with_long_name_more_than_30_chars" not-null="true" />
</many-to-one>
...
一切都运行正常,直到发生延迟加载(一个“TableA”实例尝试加载“Set of TableB”)。在生成的sql查询中,外键与其原始的30+字符长度名称一起使用。看起来像:
选择refid_with_long_name_more_than_30_chars ...
这会导致“标识符太长”异常。
如果我编辑“TableA.hbm.xml”并将列名“refid_with_long_name_more_than_30_chars”切换为30个字符,它将起作用(对于Oracle)。但我不想这样做,我更喜欢在“HibernateUtil.java”中动态地执行此操作。
我还没有找到配置它的位置。另一方面,我的印象是,一旦我正确地完成了列映射,就应该没有更多的配置(或不是?)
问题是:除了列映射之外,还有一些我需要做的事情,以指示延迟加载使用新的切断列名称?