2013-04-12 13 views
10

Ho una tabella GameCycle in un db che contiene una colonna di tipo datenumber. I valori in questa colonna sono numeri a 8 cifre che rappresentano una data inversa come "20130301". Mappato su questa tabella ho una classe GameCycle che contiene un campo protetto iDate di tipo java.util.Date. Questo campo è annotato '@Type(type = "inverseDate")', usando un mapping di tipo personalizzato. La classe Gamecycle è annotata con '@TypeDef(name = "inverseDate", typeClass = InverseDateType.class)'JPA indipendente tipo personalizzato mappatura/javax.persistence.x alternativa al org.hibernate.annotations.Type e org.hibernate.annotations.TypeDef

import org.hibernate.annotations.Type; 
import org.hibernate.annotations.TypeDef; 

@Entity 
@TypeDef(name = "inverseDate", typeClass = InverseDateType.class) 
@Table(name = "GAMECYCLE") 
public class GameCycle implements Comparable<GameCycle>, Serializable 
{ 
    @Type(type = "inverseDate") 
    @Column(name = "GC_DATE", nullable = false) 
    protected Date iDate = null; 
    ... 

Ovviamente, le importazioni si legano a me di utilizzare hibernate come implementazione JPA quindi la mia domanda è:

C'è un modo per sbarazzarsi delle annotazioni Hibernate e eseguire la stessa mappatura dei tipi personalizzati utilizzando una soluzione pura javax.persistence?

risposta

7

No. La versione corrente delle specifiche JPA non supporta i mapping dei tipi personalizzati. È una delle funzionalità più ricercate per il futuro JPA 2.1.

Se si vuole veramente sbarazzarsi degli annunci specifici di Hibernate, l'unica cosa che si può fare è mappare il campo come String ed effettuare manualmente la conversione necessaria (in getter/setter).

Ma in pratica quasi tutte le grandi applicazioni basate su JPA utilizzano alcune funzionalità specifiche dell'implementazione del provider di persistenza, quindi non credo che la dipendenza da Hibernate in questo caso sia molto importante.

+0

Peccato, avevo sospettato che l'unica soluzione oltre ad essere legato ad un'implementazione sarebbe un po 'di conversione nei getter/setter. Grazie per la risposta rapida però. – tyler

20

Personalizzata tipo Mapping è stato finalmente aggiunto JPA 2.1 (, parte di Java EE 7).
L'annotazione di Hibernate @Type non è più necessaria e può essere sostituita da Conversione tipo in JPA 2.1.

JPA 2.1 ha aggiunto:

L'esempio più semplice: (Esempio 1: Convertire un Attri base Bute) - from source

@Converter 
public class BooleanToIntegerConverter 
    implements AttributeConverter<Boolean, Integer> 
{ ... } 

...

@Entity 
@Table(name = "EMPLOYEE") 
public class Employee 
{ 

    @Id 
    private Long id; 

    @Column 
    @Convert(converter = BooleanToIntegerConverter.class) 
    private boolean fullTime; 

} 

Altri link:

+0

Questa dovrebbe essere la risposta accettata ora che è arrivato JPA 2.1. –