代码之家  ›  专栏  ›  技术社区  ›  kazanaki

如何以实现不可知的方式在jpa中创建clob

  •  21
  • kazanaki  · 技术社区  · 14 年前

    我正在使用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/eclipseelink或者其他什么我就不需要改变什么了?

    2 回复  |  直到 14 年前
        1
  •  36
  •   ewernli    14 年前

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

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

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

        2
  •  -1
  •   Brian Deterling    14 年前

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

    如果您知道您的数据库将支持clob,但在我们的情况下运行得非常好,那么可能会过分了。