2010-08-30 13 views
0

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:

  1. Je crée un objet & persiste, il obtient et id
 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 
  1. je ferme la PersistenceManager
  2. Dans l'application, je modifie mon objet (Transitoire)
  3. 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)

Répondre

0

J'ai résolu mon problème (@point 2)

 
pm = PMF.getPM(); 
dao = pm.getObjectById(DO.class, 1L); 
dao.setValue("B"); 
pm.makePersistent(dao); 
pm.close(); 

Mais cette solution est peu coûteuse si je 70-100 champs, parce que je dois définir chacun séparément.

Je ne l'ai pas fait manuellement, mais avec la réflexion - mais alors quel est l'avantage de DataNucleus sur Hibernate? - qui (autant que je sache) utilise aussi l'introspection runtime.

S'il vous plaît me corriger si je me trompe - je suis encore un débutant dans ce domaine ... encore :)

+3

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

0

Vous n'avez pas besoin d'appeler makePersistent planifions.

long id = objectId; //Id of the object you want to update. 

pm = PMF.getPM(); 

DO dao = pm.getObjectById(DO.class, id); 
dao.setValue("B"); 

pm.close(); 

Pour supprimer le faire;

long id = objectId; //Id of the object you want to delete. 
pm = PMF.getPM(); 

DO dao = pm.getObjectById(DO.class, id); 
pm.deletePersistent(dao); 

pm.close(); 

Vous n'utilisez pas de transaction pour valider. Vous pouvez appeler