Comment persister une entité qui contient un champ de type utilisateur à l'aide JPA2

StackOverflow https://stackoverflow.com/questions/2492160

  •  21-09-2019
  •  | 
  •  

Question

Je cherche un moyen de maintenir une entité qui contient un champ d'un type d'utilisateur. Dans cet exemple particulier, je voudrais persister ts champ comme nombre de millisecondes.

import org.joda.time.DateTime;

@Entity
public class Foo {

  @Id
  private Long id;

  private DateTime ts;
}
Était-ce utile?

La solution

JPA n'a pas la possibilité d'enregistrer les types de propriétés personnalisés, vous devrez utiliser des trucs spécifiques du fournisseur:

Autres conseils

Comme il n'est pas un type pris en charge défini JPA vous comptez sur les détails de mise en œuvre. DataNucleus a un plugin pour JodaTime qui permettrait à votre persistance désirée.

Soit vous pouvez utiliser ces étoffes spécifiques du fournisseur ou vous pouvez utiliser @PostPersist, @PostUpdate, méthodes de rappel de @PostLoad avec un champ de @Transient de substitution.

http://www.java2s.com/Tutorial/Java/0355__JPA/ EntityListenerPostLoad.htm vous donnera une idée.

S'il vous plaît sentir à l'aise d'entrer en contact pour toute précision supplémentaire.

Une solution consiste à utiliser les propriétés non-colonne et les encapsuler avec getters / setters.

Pour dire JPA utiliser getters / setters à la place des champs privés accesing directement, vous devez annoter @Id sur publique à long getId () au lieu de Long ID privé . Quand vous faites cela, rappelez-vous juste utiliser @Transient pour chaque getter qui ne correspond pas directement à une colonne.

L'exemple suivant créer une colonne Date méthodes nommée myDate , alors que l'application aurait DateTime Getts () et Pavés () disponible pour elle. (Pas sûr de l'API DateTime, alors s'il vous plaît pardonner des erreurs mineures:))

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; }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top