Come a persistere un'entità che contiene un campo di tipo utente utilizzando JPA2

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

  •  21-09-2019
  •  | 
  •  

Domanda

Sto cercando un modo a persistere un'entità che contiene un campo di un tipo di utente. In questo esempio particolare desidero persistere ts campo come numero di millisecondi.

import org.joda.time.DateTime;

@Entity
public class Foo {

  @Id
  private Long id;

  private DateTime ts;
}
È stato utile?

Soluzione

APP non ha la possibilità di registrare i tipi di proprietà personalizzati, dovrete usare roba specifico fornitore:

Altri suggerimenti

Dal momento che non è un tipo supportato JPA definito si basano su specifiche di implementazione. DataNucleus ha un plugin per JodaTime che permetterebbe la vostra perseveranza desiderato.

In entrambi è possibile utilizzare questi animali specifici provider o si può fare uso di @PostPersist, @PostUpdate, metodi di callback @PostLoad con un campo @Transient surrogata.

http://www.java2s.com/Tutorial/Java/0355__JPA/ EntityListenerPostLoad.htm vi darà qualche idea.

Si prega di stare tranquillo a mettersi in contatto per qualsiasi ulteriore chiarimento.

Una soluzione è quella di utilizzare le proprietà non-colonna e li incapsulare con getter / setter.

A dire APP a utilizzare getter / setter, invece di accesing direttamente campi privati, è necessario annotare @Id su pubblici lungo getId () al posto di privato lungo id . Nel fare questo, basta ricordarsi di utilizzare @Transient per ogni getter che non corrisponde direttamente ad una colonna.

Il seguente esempio creare una colonna Data di nome myDate , mentre l'applicazione avrebbe DateTime Getts () e cubetti () metodi disponibili per esso. (Non sono sicuro DateTime API, quindi ti prego di perdonare piccoli errori:))

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; }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top