如何以与实现无关的方式在 JPA 中创建 Clob

2022-09-01 17:14:06

我正在使用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或其他东西,我就不必改变任何东西了吗?


答案 1

JPA 规范 (§ 9.1.5) 就是这样一个例子。

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

我相信这是CLOB的标准方式。


答案 2

我不确定我会不会再做一次,但在过去,当我需要将我的应用程序限制为最广泛使用的sql类型子集时,我使用单独的char表实现了二进制对象,并将其gz压缩和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 化和编码,如果它适合,则将其存储在简单列中,否则将其拆分为子记录。这也会让你延迟加载,如果数据适合单个列,它甚至不必做一个单独的查询。

如果您知道您的数据库将支持 clobs,但在我们的情况下效果很好,则可能有些过分。


推荐