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 の書き込み/読み込みの具体的な方法あたり。

 

猪股弘明