2010-04-14 15 views
19

sto usando EJB3 e JPA (sulla base degli Hibernate e Oracle 10g per il momento)Come creare un Clob in JPA in un'implementazione agnostica modo

Ho un'entità che 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; 
    } 

Quindi voglio salvare un'entità di questo tipo.

Al momento sto facendo la seguente che funziona perfettamente

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

Tuttavia questa lega il mio codice di Hibernate! Ho appositamente evitato le estensioni Hibernate e ho usato solo annotazioni JPA. Il codice funziona perché Hibernate è la mia attuale implementazione.

C'è una sorta di JPA API che mi permette di creare un CLOB in modo generico? Quindi, se in seguito ho deciso di passare a Braccio terzo/EclipseLink o qualcos'altro che non dovrò cambiare una cosa?

risposta

32

C'è un esempio è la specifica JPA (§ 9.1.5)

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

Credo che sia il modo standard per CLOB.

+1

Si potrebbe anche voler '@Basic (fetch = LAZY)' per il caricamento lazy. – axtavt

+1

@Basic (prendere = LAZY) non funzionerà in una proprietà di ibernazione. Almeno non senza instumentation. – yannisf

+3

Non funziona con "Oracle 11g R2" - la mia definizione di colonna è @Column (columnDefinition = "CLOB NOT NULL") @Lob note stringa private; ma Oracle crea sempre la colonna come "CLOB (4000)". Mi sto perdendo qualcosa ? Sto usando la versione "Hibernate 3.2.0-Final" (con JBoss 6.0-Final). – javauser71

-1

Non sono sicuro che lo farei di nuovo, ma in passato, quando avevo bisogno di limitare la mia app al sottoinsieme più usato di tipi sql, ho implementato oggetti binari usando una tabella separata di caratteri e li ho memorizzati con gzip e base 64 codificato. Utilizzando la mappatura XML, è stato qualcosa di simile a:

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

Nel codice, il metodo getValue recuperate i risultati getEncodedValue, tutti concatenati insieme e poi decodificato e decompresso. In qualità di ottimizzazione, ho messo una colonna semplice valore sulla tabella padre e usato che se potesse andare bene nei personaggi 2000 e sono andato solo per la tabella figlio, se necessario.

Il metodo setValue lo ha gzip e codificato e lo ha memorizzato nella colonna semplice se adatto, altrimenti diviso in record figlio. Che si ottiene anche il caricamento pigro e se i dati si inserisce in una singola colonna, non ha nemmeno bisogno di fare una query separata.

probabilmente eccessivo se si sa che i database sosterranno CLOB, ma funzionava abbastanza bene nella nostra situazione.

Problemi correlati