J'ai mis en place un petit projet en utilisant apache.JDO/w DataNucleus. Je peux enregistrer des données sans aucun problème, mais je me suis coincé en essayant de les mettre à jour ou de les supprimer.Comment utiliser JDO (DataNucleus) pour mettre à jour et supprimer des données?
Le scénario est le suivant:
- Je crée un objet & persiste, il obtient et id
@PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id;
- je ferme la PersistenceManager
- Dans l'application, je modifie mon objet (Transitoire)
- J'essaie de persister à nouveau (le i champ D est le même), mais au lieu de mettre à jour il crée un nouvel objet
Dans Google App Engine le même scénario m'a donné une mise à jour (les résultats attendus - voir ci-dessous).
Je vais aussi vous donner un petit exemple de code pour illustrer mon problème:
PersistenceManager pm = PMF.getPM(); Option dao = new Option(String.class, "field", "A"); pm.makePersistent(dao); pm.close(); System.out.println("1"); for (Object o : Model.findAll(Option.class)) System.out.println(((Option) o).getValue()); dao.setValue("B"); pm = PMF.getPM(); pm.makePersistent(dao); pm.close(); System.out.println("2"); for (Object o : Model.findAll(Option.class)) System.out.println(((Option) o).getValue()); pm = PMF.getPM(); pm.makePersistent(dao); pm.deletePersistent(dao); pm.close(); System.out.println("3"); for (Object o : Model.findAll(Option.class)) System.out.println(((Option) o).getValue());
Je pense que la sortie soit:
1 A 2 B 3
Mais au lieu de cela me donne:
1 A 2 A B 3 A B
Des suggestions sur ce que je fais mal? (BTW-je utiliser RW non transactionnel, avec RetainValues activés)
Vous n'appelez pas à nouveau makePersistent(), puisque l'objet est en état persistant, de sorte que toute mise à jour est détectée automatiquement (contrairement à Hibernate - qui doit déterminer ce qui est changé). Et si vous avez 70-100 champs? Vous en avez mis un à jour, donc il en met un à jour. Les docs DN définissent quels sont les avantages – DataNucleus