Hibernate列映射和集合延迟加载

时间:2013-03-19 14:41:53

标签: oracle hibernate

有一个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”中动态地执行此操作。

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

问题是:除了列映射之外,还有一些我需要做的事情,以指示延迟加载使用新的切断列名称?

0 个答案:

没有答案