2010-05-06 4 views
26

Ho un'istanza di entità JPA nel livello dell'interfaccia utente Web della mia applicazione. Mi piacerebbe sapere in qualsiasi momento se questa entità è già stata conservata nel database o se è presente solo nella sessione utente.Come sapere se un'entità JPA separata è già stata mantenuta o meno?

Sarebbe nel livello aziendale, userei il metodo entitymanager.contains (Entity), ma nel mio livello UI penso di aver bisogno di un attributo extra che indica se l'entità è stata salvata o meno. Come lo implementa? Sto considerando la seguente opzione per il momento:

  • un attributo JPA con un valore predefinito impostato dal database, ma imporrà una nuova lettura dopo ogni aggiornamento?
  • un attributo non JPA impostato manualmente nel mio codice o impostato automaticamente da JPA?

Qualche consiglio/altri suggerimenti?

Utilizzo JPA 1 con implementazione Hibernate 3.2 e preferirei attenermi allo standard.

risposta

44

Innanzitutto, ricordiamo i vari stati di un'entità. Dalla specifica JPA 1.0 (nella sezione 3.2 dell'Ente grado Ciclo di Vita):

Questa sezione descrive le operazioni EntityManager per la gestione del ciclo di vita di un'istanza dell'entità. Un'istanza dell'entità può essere caratterizzata come come nuova, gestita, indipendente o rimossa.

  • Un nuova istanza entità ha senza identità persistenti, e non è ancora associata a un contesto di persistenza.
  • Un gestito istanza di entità è un'istanza con un'identità persistente che è attualmente associato ad un contesto di persistenza.
  • Un indipendente istanza dell'entità è un'istanza con un'identità persistente che non è (più) associato ad un contesto di persistenza.
  • A rimosso L'istanza di entità è un'istanza con un'identità persistente, associata a un contesto di persistenza, che è pianificata per la rimozione dal database.

E un'illustrazione grafica:

alt text

Quindi, per definizione, un ente indipendente è già stato persistito, e io in realtà non credo che questa è la tua vera domanda. Ora, se si vuole sapere se un soggetto è nuova (vale a dire non ha alcuna identità persistente), che dire di questo:

@Transient 
public boolean isNew() { 
    return (this.id == null); 
} 
+0

Assolutamente, voglio sapere se il mio soggetto è nuovo.Preferirei utilizzare un altro campo con un valore predefinito impostato nel database poiché non sto utilizzando una strategia JPA GeneratedValue per la chiave primaria (mi sto impostando la chiave primaria con un UUID per il fornitore di database incrociato/implementazione jpa/compatibilità di clustering). – snowflake

+2

@snowflake Il problema è che JPA non supporta i valori generati dal database per gli attributi non pk, quindi dovrai usare un'estensione del provider JPA (come '@ org.hibernate.annotations.Generated') o aggiornare le tue entità dopo la permanenza , che è brutto. Mi chiedo se usare '@ GeneratedValue' non sarebbe una scelta migliore. –

+0

Grazie per il tuo commento. Hai ragione, questo è brutto, preferirei usare come alternativa un campo impostato e dal mio DAO. – snowflake