- PR -

Hibernate3とPL/pgSQLの連携について

1
投稿者投稿内容
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2005-12-05 20:40
わかです。

==環境==
JDK 5.0
Hibernate 3
PostgreSQL 8.1.0
======

PL/pgSQLにてユニークな文字列を作成し
それをテーブルの主キーに設定したいと考えています。

# シーケンスでは規則性がありすぎ、自動発番するユーザIDとして扱い難いので
# PL/pgSQLにて十分複雑で、まだ列に存在しないIDを作成する、というケースです。

Session#createSQLQuery()で実現できるかと思いましたが、
HQLの書き方が思いつかず苦戦しています。

この場合は、Hibernateを使わず、
直接JDBCを扱うしか方法がないのでしょうか。

googleなどで調べましたが、有用なヒントを見つけることができませんでした。
上記のことを実現された方がおられましたら、
ヒントなどご教授いただければ幸いです。

どうぞ、よろしくお願いします。
わか
常連さん
会議室デビュー日: 2003/12/14
投稿数: 47
お住まい・勤務地: 広島市
投稿日時: 2005-12-05 22:27
お世話になります、わかです。

HQLがどうしても思いつかないため、
現在は次のように実装して目的の動作を実現しています。

■Hibernateで使っていたDAO
コード:
public void ins(Bean bean) throws Exception {


Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

try {
session.save(bean);
tx.commit();
}
catch (Exception e) {
log.error("ins " + e.getMessage());
tx.rollback();
throw e;
}
finally {
session.close();
}
}



■書き換え後
コード:
public void ins(Bean bean) throws Exception {


Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

PreparedStatement ps = session.connection().prepareStatement(PL/pgSQLを含むsql);

int i = 1;

ps.setString(i++, bean.getValue1);
(・・・)
ps.setString(i++, bean.getValueN);

try {
ps.executeUpdate();
ps.close();
tx.commit();
}
catch (Exception e) {
log.error("ins " + e.getMessage());
tx.rollback();
throw e;
}
finally {
session.close();
}
}



このように使い分けるのが一般的なHibernateの使い方なのでしょうか。


## 2005/12/5 22:28 誤字を修正

[ メッセージ編集済み 編集者: わか 編集日時 2005-12-05 22:29 ]
1

スキルアップ/キャリアアップ(JOB@IT)