PostgresまたはOracleに接続できるようにしたいHibernate 3.5.2アプリケーションがあります。2 つのスキーマは似ていますが、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>
...
遅延ロードが発生するまで、すべて正常に実行されます (1 つの「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」で動的に行うことを好みます。
これを設定する場所が見つかりません。一方、列のマッピングを適切に行ったらすぐに、構成するものは何もないはずです (またはしないでください)。
問題は、列のマッピングとは別に、遅延ロードに新しい切り刻まれた列名を使用するように指示するために、他にやらなければならないことがありますか?