2008-12-05 8 views
1

Si l'on a une entité Foo et un appel persist (foo), l'ID @Id est automatiquement défini sur l'entité. Toutefois, si ladite entité Foo possède une collection de barres qui lui sont liés parComment récupérer l'ID d'une entité persistée via cascade avec JPA

(...) 
@OneToMany(cascade=Cascade.ALL) 
Set<Bar> getBars() 
(...) 

et ce cas est déjà persisté, si l'on crée une nouvelle barre et l'ajouter à la collection Les barres de foo et appels de fusion (foo) la barre juste créée est persistante, mais son @Id n'est pas mis à jour!

Y at-il un moyen de récupérer cet ID, sans faire un appel ultérieur à trouver (Foo.class, foo.getId())?

Répondre

0

Un appel à merge() ne mettra pas à jour les objets transmis. Il retournera cependant les objets mis à jour.

De la documentation Hibernate:

http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate-saveorupdate.html

et de fusion() est très différent:

  • s'il y a une instance persistante avec le même identifiant actuellement associé à la session, copiez le état de l'objet donné sur l'instance persistante
  • S'il n'y a pas d'instance persistante actuellement associée à la session, essayez de la charger depuis la base de données, o r créer une nouvelle instance persistante
  • l'instance persistante est retournée
  • l'instance donnée ne devient pas associé à la session, il reste détaché
+0

Alors, comment puis-je mettre à jour ces objets? – user43845

+0

Que se passe-t-il si vous enregistrez l'objet Foo, puis examinez l'instance de Foo qui est retournée à partir de merge()? Les objets Bar ont-ils leurs propriétés d'ID définies? Sinon, vous devrez peut-être appeler flush() sur votre EntityManager, en fonction de la façon dont vous manipulez le @Id for Bar. –

+0

Désolé, dans la première phrase, j'aurais dû dire "ce qui se passe si vous fusionnez l'objet Foo" –

Questions connexes