Como persistir uma entidade que contém um campo de tipo de usuário usando JPA2
Pergunta
Estou procurando uma maneira de persistir uma entidade que contém um campo de um tipo de usuário. Neste exemplo em particular, gostaria de persistir o ts campo como número de milissegundos.
import org.joda.time.DateTime;
@Entity
public class Foo {
@Id
private Long id;
private DateTime ts;
}
Solução
A JPA não tem a capacidade de registrar tipos de propriedades personalizadas, você precisará usar coisas específicas do provedor:
- Hibernate: http://joda time.sourceforge.net/contrib/hibernate/
- Eclipselink: http://code.google.com/p/joda-time-eclipselink-integation/
OpenJpa: http://issues.apache.org/jira/browse/openjpa-473 (Ainda aberto)
Outras dicas
Como não é um tipo de suporte definido pela JPA, você confia nas especificidades de implementação. O DataNucleus tem um plug -in para Jodatime que permitiria a persistência desejada.
Ou você pode usar essas coisas específicas do provedor ou pode usar @PostPersist
, @PostUpdate
, @PostLoad
Métodos de retorno de chamada com um substituto @Transient
campo.
http://www.java2.com/tutorial/java/0355__jpa/entityListenerpostload.htm Vou te dar uma ideia.
Por favor, sinta -se confortável para entrar em contato para qualquer esclarecimento adicional.
Uma solução é usar propriedades de não coluna e encapsulá-las com getters/setters.
Para dizer ao JPA para usar getters/setters em vez de acessar diretamente os campos privados, você deve anotar @id em public Long Getid () ao invés de Private Long Id. Ao fazer isso, lembre -se de usar @Transient para cada getter que não corresponde diretamente a uma coluna.
O exemplo a seguir criaria uma coluna de data nomeada meu encontro, enquanto o aplicativo teria métodos DateTime Getts () e Setts () disponíveis para ele. (Não tenho certeza da API DateTime, então perdoe pequenos erros :))
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; }
}