2010-04-14 12 views
19

estoy usando ejb3 y JPA (basado en la hibernación y Oracle 10g en el momento)Cómo crear un CLOB en APP en una implementación independiente del camino

Tengo una entidad que contiene un 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; 
    } 

Luego quiero guardar una entidad de este tipo.

En el momento que estoy haciendo lo siguiente, que funciona perfectamente

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

Sin embargo, esto ata mi código para Hibernate! Hasta ahora, he evitado específicamente las extensiones de Hibernate y he usado solo anotaciones JPA. El código funciona porque de hecho Hibernate es mi implementación actual.

¿Hay algún tipo de API JPA que me permita crear un clob de forma genérica? Entonces, si más tarde decido cambiar a Toplink/EclipseLink o alguna otra cosa, ¿no tendré que cambiar nada?

Respuesta

32

Hay un ejemplo de ello es la especificación JPA (§ 9.1.5)

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

Creo que es la manera estándar para CLOB.

+1

También es posible que desee '@Basic (fetch = LAZY)' para la carga diferida. – axtavt

+1

@Basic (fetch = LAZY) no funcionará en una propiedad de hibernación. Al menos no sin instumentación. – yannisf

+3

No funciona con "Oracle 11g R2" - la definición de mi columna es @Column (columnDefinition = "CLOB NOT NULL") @Lob private String notes; pero Oracle siempre crea la columna como "CLOB (4000)". Me estoy perdiendo de algo ? Estoy usando la versión "Hibernate 3.2.0-Final" (con JBoss 6.0-Final). – javauser71

-1

No estoy seguro de que volvería a hacerlo, pero en el pasado, cuando necesitaba limitar mi aplicación al subconjunto más utilizado de tipos sql, implementé objetos binarios utilizando una tabla de caracteres separada y la almacené gzip y base 64 codificada. El uso de mapeo XML, que era algo así como:

<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> 

En el código, el método getValue recuperó los resultados getEncodedValue, todos ellos concatenados juntos y luego decodifica y se les abrió la cremallera. Como optimización, puse una columna de valor simple en la tabla principal y la usé si pudiera caber en los 2000 caracteres y solo fue a la tabla secundaria si fuera necesario.

El método setValue gzipó y lo codificó y lo almacenó en la columna simple, si no, lo dividió en los registros secundarios. Eso también hace que la carga sea lenta y si los datos encajan en una sola columna, ni siquiera tiene que hacer una consulta por separado.

Probablemente exagere si sabe que sus bases de datos admitirán clobs, pero funcionó bastante bien en nuestra situación.

Cuestiones relacionadas