有一个 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”实例尝试加载“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”中动态地进行。
我还没有找到在哪里配置它。另一方面,我的印象是,一旦我正确地完成了列映射,就应该没有更多的配置(或没有?)
问题是:除了列映射之外,我还需要做些什么,以指示延迟加载使用新的切分列名?