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 确实是我当前的实现。

是否有某种 JPA API 允许我以通用方式创建 clob?因此,如果以后我决定切换到 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 方法对其进行压缩和编码,如果合适,则将其存储在简单列中,否则将其拆分为子记录。这也会让您延迟加载,如果数据适合单个列,它甚至不必执行单独的查询。

如果您知道您的数据库将支持 clob,则可能有点矫枉过正,但在我们的情况下工作得很好。

于 2010-04-14T21:17:38.163 回答