0

有一个 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”中动态地进行。

我还没有找到在哪里配置它。另一方面,我的印象是,一旦我正确地完成了列映射,就应该没有更多的配置(或没有?)

问题是:除了列映射之外,我还需要做些什么,以指示延迟加载使用新的切分列名?

4

0 回答 0