java - Cómo crear un Clob en JPA de una forma independiente de implementación
jpa clob (2)
Estoy usando Ejb3 y JPA (basado en Hibernate y Oracle 10g en este momento)
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;
}
Entonces quiero guardar una entidad de este tipo.
En este momento 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 a Hibernate! Hasta ahora he evitado específicamente las extensiones de Hibernate y solo he usado las 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 luego decido cambiar a Toplink / EclipseLink o alguna otra cosa, ¿no tendré que cambiar nada?
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 forma estándar de CLOB.
No estoy seguro de volver a hacerlo, pero en el pasado, cuando tenía que limitar mi aplicación al subconjunto de tipos de SQL más utilizado, implementé objetos binarios utilizando una tabla separada de caracteres y lo almacené en formato Gzip y la base 64 codificada. . Usando el mapeo XML, fue algo 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 de getEncodedValue, los concatenó todos juntos y luego los descodificó y descomprimió. Como optimización, puse una columna de valor simple en la tabla principal y la utilicé si podía caber en los 2000 caracteres y solo iba a la tabla secundaria si era necesario.
El método setValue lo comprimió y lo codificó y lo almacenó en la columna simple si encajaba, de lo contrario, divídalo en los registros secundarios. Eso también le permite realizar una carga lenta y si los datos se ajustan a una sola columna, ni siquiera tiene que hacer una consulta por separado.
Probablemente exageres si sabes que tus bases de datos admitirán clobs, pero funcionaron bastante bien en nuestra situación.