26

私はEjb3とJPAを使用しています(現時点ではHibernateとOracle 10gに基づいています)

Clob を含むエンティティがあります

@Entity
@Table(name = "My_TAB")
public class ExampleEntity implements java.io.Serializable {

    private Clob someText;

    public void setSomeText(Clob someText) {
        this.someText= someText;
    }

    @Column(name = "COLUMN_NAME")
    public Clob getSomeText() {
        return this.someText;
    }

次に、このタイプのエンティティを保存したいと思います。

現時点では、完全に機能する次のことを行っています

ExampleEntity exampleEntity = new ExampleEntity();
exampleEntity.setSomeText(Hibernate.createClob(aStringValue));
someOtherDao.save(exampleEntity);

ただし、これは私のコードを Hibernate に結び付けます! これまでのところ、特に Hibernate 拡張を避け、JPA アノテーションのみを使用してきました。実際にHibernateが私の現在の実装であるため、コードは機能します。

一般的な方法で clob を作成できる JPA API はありますか? 後でToplink/EclipseLinkなどに切り替えることにした場合、何も変更する必要はありませんか?

4

2 に答える 2

45

そのような例は、JPA 仕様 (§ 9.1.5) です。

@Column(name="DESC", 
columnDefinition="CLOB NOT NULL", 
table="EMP_DETAIL") 
@Lob 
public String getDescription() { return description; }

それがCLOBの標準的な方法だと思います。

于 2010-04-14T12:04:58.360 に答える
-1

もう一度やり直すかどうかはわかりませんが、以前、アプリを最も広く使用されている SQL 型のサブセットに制限する必要があったとき、char の別のテーブルを使用してバイナリ オブジェクトを実装し、それを gzip して base 64 エンコードして保存しました。 . XML マッピングを使用すると、次のようになります。

<list name="encodedValue" lazy="true" table="TABLE" cascade="all-delete-orphan">
  <key column="TABLE_ID"/>
  <index column="SEQ"/>
  <element type="string" column="LINE" length="2000"/>
</list>

コードでは、getValue メソッドが getEncodedValue の結果を取得し、それらをすべて連結してから、デコードして解凍しました。最適化として、単純な値列を親テーブルに配置し、2000 文字に収まる場合はそれを使用し、必要な場合にのみ子テーブルに移動しました。

setValue メソッドはそれを gzip してエンコードし、収まる場合は単純な列に格納し、そうでない場合は子レコードに分割しました。これにより、遅延読み込みも可能になり、データが 1 つの列に収まる場合は、別のクエリを実行する必要さえありません。

データベースが CLOB をサポートすることがわかっている場合は、おそらくやり過ぎですが、私たちの状況ではかなりうまく機能しました。

于 2010-04-14T21:17:38.163 に答える