Java hibernate を利用した PotsgreSQL LOB の取り扱い
以前に OpenDolphin-2.7m という電子カルテのプロジェクトをやっていたとき、ユーザー(大半は医師の方々)の理解がアヤしいと感じた箇所は LOB のあたり。
一般的に『データベース=巨大なエクセル』みたいな説明がなされているので、「電子カルテの実体は LOB 領域に永続化されています」と言って即座に理解できる医師はそう多くなかった。
OpenDolphin 自体のデータ構造がかなりわかりにくく、コーディングもかなり「正統派」スタイルだったため、敷居が高かったせいもあるのかもしれない。
PostgreSQL の LOB に関しては、sql ・jdbc などのドライバ・ORM (Java であれば hibernate)などを介して操作できる。
プログラミング言語を介して LOB を操作するのであれば、やはり ORM を使うのが一番楽だと思う。
最もシンプルな書き方は以下の通り。
@Entity
public class Lobs implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String content;
@Lob
private byte[] binarylob;
@Lob
private String charlob;
(以下、セッター・ゲッターなどを定義)
適当な名前の String と byte[] を用意して @Lob アノテーションを付ければ、hibernate はこれを LOB (それぞれ clob, blob になる)として取り扱ってくれる。
プロジェクトが適切に構成されていれば、アプリ起動時に hibernate は class Lobs に対応したテーブル lobs を自動で作成してくれる。
実際に得られたテーブルは以下の通り。
この書き方だと
・blob, clob とも oid 型になる
・String は character varying(255) となる
のが「へえ」という感じだ。
次回は、lob の書き込み/読み込みの具体的な方法あたり。
猪股弘明