2010-05-06 4 views
26

J'ai une instance d'entité JPA dans la couche d'interface Web de mon application. Je voudrais savoir à tout moment si cette entité a déjà été conservée dans la base de données ou si elle est seulement présente dans la session de l'utilisateur. Je voudrais utiliser la méthode entitymanager.contains (Entity), mais dans ma couche d'interface utilisateur, je pense avoir besoin d'un attribut supplémentaire indiquant si l'entité a été enregistrée ou non. Comment mettre en œuvre cela? Je considère l'option suivante pour l'instant:Comment savoir si une entité JPA détachée a déjà été conservée ou non?

  • un attribut JPA avec une valeur par défaut définie par la base de données, mais forcerait une nouvelle lecture après chaque mise à jour?
  • un attribut non JPA défini manuellement dans mon code ou automatiquement défini par JPA?

Un conseil/autres suggestions? J'utilise JPA 1 avec l'implémentation d'Hibernate 3.2 et je préférerais rester fidèle à la norme.

Répondre

44

D'abord, rappelons les différents états d'une entité. De la spécification JPA 1.0 (à la section 3.2 du cycle de vie de l'entité instance):

Cette section décrit les opérations EntityManager pour la gestion du cycle de vie est une instance d'entité. Une instance d'entité peut être caractérisée comme étant nouvelle, gérée, détachée ou supprimée.

  • Une nouvelle instance d'entité n'a pas d'identité persistante, et n'est pas encore associée à un contexte de persistance.
  • Un géré instance d'entité est une instance avec une identité persistante qui est actuellement associée à un contexte de persistance.
  • A détaché instance d'entité est une instance avec une identité persistante qui ne sont pas (ou plus) associé à un contexte de persistance.
  • Une instance d'instance supprimée est une instance avec une identité persistante, associée à un contexte de persistance, qui est planifiée pour être supprimée de la base de données.

Et une illustration graphique:

alt text

donc, par définition, une entité indépendante a déjà été persisté, et je ne pense pas vraiment que c'est votre vraie question. Maintenant, si vous voulez savoir si une entité est nouvelle (à savoir n'a pas de l'identité persistante), qu'en ceci:

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

Absolument, je veux savoir si mon entité est nouvelle.Je préférerais utiliser un autre champ avec une valeur par défaut dans la base de données puisque je n'utilise pas de stratégie JPA GeneratedValue pour la clé primaire (je me configure la clé primaire avec un UUID pour la compatibilité fournisseur/base de données). – snowflake

+2

@snowflake Le problème est que JPA ne prend pas en charge les valeurs générées par la base de données pour les attributs non pk, donc vous devrez utiliser une extension de fournisseur JPA (comme '@ org.hibernate.annotations.Generated') ou pour actualiser vos entités après avoir persisté , ce qui est moche. Je me demande si l'utilisation de '@ GeneratedValue' ne serait pas un meilleur choix. –

+0

Merci pour votre commentaire. Tu as raison c'est moche, je préférerais utiliser comme alternative un ensemble de champs dans et par mon DAO. – snowflake

Questions connexes