2010-03-22 10 views

Respuesta

6

APP no tiene la posibilidad de registrar los tipos de propiedad personalizada, que tendrá que utilizar proveedor de cosas específicas:

+2

increíble que no se acumulan en los adaptadores como lo hicieron en JAXB: DateAdapter clase pública se extiende XmlAdapter {... –

1

Dado que no es un tipo compatible con JPA, confía en los detalles de la implementación. DataNucleus tiene un complemento para JodaTime que permitiría la persistencia deseada.

1

O puede utilizar esos productos específicos del proveedor o puede hacer uso de @PostPersist, @PostUpdate, @PostLoad métodos de devolución de llamada con un campo sustituto @Transient.

http://www.java2s.com/Tutorial/Java/0355__JPA/EntityListenerPostLoad.htm le dará una idea.

Por favor, siéntase cómodo para ponerse en contacto para cualquier aclaración.

+0

@Mick Bueno, siempre puedes serializar tu objeto Serializable personalizado a '@ LOB' [http://www.java2s.com/Tutorial/Java/0355__JPA/MarkStringAsLob.htm] –

1

Una solución es utilizar propiedades que no sean columnas y encapsularlas con getters/setters.

A decir APP utilizar métodos get/set en lugar de directamente accediendo campos privados, se debe anotar en @Id pública a largo getId() en lugar deIdentificación largo privada. Al hacer esto, simplemente recuerde utilizar @Transient para cada getter que no corresponda directamente a una columna.

El siguiente ejemplo crearía una columna de fecha denominada myDate, mientras que la aplicación tendría los métodos DateTime getTs() y setTs() disponibles para ella. (No estoy seguro sobre el API DateTime, así que por favor, perdona errores menores :))

import org.joda.time.DateTime; 

@Entity 
public class Foo { 

    private Long id; 

    private DateTime ts; 

    @Id 
    public Long getId() { return id; } 

    public void setId(Long id) { this.id = id; } 



    // These should be accessed only by JPA, not by your application; 
    // hence they are marked as protected 

    protected Date getMyDate() { return ts == null ? null : ts.toDate(); } 

    protected void setMyDate(Date myDate) { 
    ts = myDate == null ? null : new DateTime(myDate); 
    } 



    // These are to be used by your application, but not by JPA; 
    // hence the getter is transient (if it's not, JPA will 
    // try to create a column for it) 

    @Transient 
    public DateTime getTs() { return ts; } 

    public void setTs(DateTime ts) { this.ts = ts; } 
} 
Cuestiones relacionadas