2015-10-07 16 views
8

Stiamo sviluppando un'applicazione collegata a un database precedente. Questo è molto "non tipizzato", usando stringhe per quasi tutti i dati. Quel che è peggio è che è lontano dall'essere omogeneo: usa diversi pattern per date o ore ('YYDDMM', 'HHMMSS', millisecondi) e booleani ('Y'/'N', 'X'/''), per esempio.JPA: istanze parametrizzate di AttributeConverter

Vogliamo utilizzare JPA (EclipseLink) e convertitori personalizzati. Il problema è che @Convert si aspetta una classe che implementa AttributeConverter, quindi dobbiamo fare nuove classi per ogni modello. Quello che mi piacerebbe è una classe BooleanConverter, che può essere istanziata con i valori 'Y'/'N' o 'X'/''.

Questo è ovviamente fuori specifica JPA, ma forse è possibile utilizzare annotazioni/configurazione di EclipseLink. Osservando la sua annotazione @Convert, è possibile specificare un convertitore per nome. Questo suona bene a me se possibile registrare un ynBooleanConverter e xSpaceBooleanConverter:

// Unfortunately, this method does not exist :(
Session.addConverter('ynBooleanConverter', new BooleanConverter("Y", "N")); 

@Entity 
public class MyEntity { 

    @Convert("ynBooleanConverter") 
    private Boolean myBoolean; 

    ... 
} 

E 'possibile? Quali altre opzioni abbiamo?

+0

è adatto per l'uso del convertitore JPA 2.1? disponibile da eclipselink versione 2.5? –

+0

Posso usare l'ultima versione di EclipseLink, ma non riesco a vedere come risolverlo. – sinuhepop

risposta

1

Prova @ObjectTypeConverter:

@Entity 
@ObjectTypeConverters({ 
    @ObjectTypeConverter(name = "ynBooleanConverter", objectType = Boolean.class, dataType = String.class, 
     conversionValues = { 
     @ConversionValue(objectValue = "true", dataValue = "Y"), 
     @ConversionValue(objectValue = "false", dataValue = "N") }), 
    @ObjectTypeConverter(name = "xSpaceBooleanConverter", objectType = Boolean.class, dataType = String.class, 
     conversionValues = { 
     @ConversionValue(objectValue = "true", dataValue = "X"), 
     @ConversionValue(objectValue = "false", dataValue = " ") }), 
}) 
public class MyEntity { 

    @Convert("ynBooleanConverter") 
    private boolean ynBoolean; 

    @Convert("xSpaceBooleanConverter") 
    private boolean xSpaceBoolean; 
} 
+0

Grazie. Funziona solo per booleani, ma non per le date con formati diversi. – sinuhepop

+0

Immagino che tu debba implementare una tua annotazione per ottenere quella conversione. Dubito che ci sia supporto per quella logica in EclipseLink o JPA. – Ish

0

Così il vostro Converter si comporta diversi a seconda uno stato nel contesto? Penso che proverei a collegare le informazioni di contesto a una variabile threadlocal che posso leggere di nuovo nell'implementazione del convertitore.

Avete accesso a un'implementazione CDI? Quindi è ancora più elegante inserire del bean con le informazioni di contesto nell'implementazione di Converter. Hai detto che ti mancano alcuni session -Metodi? Forse un bean @SessionScope ti aiuterà.

Purtroppo @Inject non è specificato in una classe di convertitore. Avrai bisogno di cercare il fagiolo "a mano" come menzionato nel post this.

+0

I convertitori non si comportano in base allo stato, ma al campo effettivo che si sta convertendo. Ho diversi modelli per date salvate usando stringhe. Non voglio creare così tante classi, ma solo una. – sinuhepop