2010-09-06 16 views
2

J'essaie de stocker un Jdo qui contient une liste. Lorsque la liste est annotées avecLe moteur d'application ne stocke pas List lorsqu'il est annoté avec serializable et defaultFetchGroup set

@Persistent (defaultFetchGroup = "true") 

Il fonctionne très bien, mais quand je

@Persistent (serializable = "true", defaultFetchGroup = "true") 

Il ne stocke pas la liste. Quelqu'un sait-il pourquoi? Que dois-je faire lorsque j'ai une liste d'objets personnalisés que je veux stocker, puis-je les marquer comme sérialisables ou non?

Répondre

1

Je vois 3 cas:

  1. un type de noyau (List<String>, List<Date>, etc ...): Vous devez utiliser @Persistent
  2. une classe @PersistenceCapable (List<MyPersistenceCapableClass>): Vous devez utiliser @Persistent, c'est la One-To-Many relationship cas
  3. pas un type de base ni une classe @PersistenceCapable mais @Serializable un (List<MySerializableClass>): Vous doit utilisation @Persistent (serializable = "true")

Lorsque vous utilisez serializable = "true", vous devez appeler JDOHelper.makeDirty pour informer JDO chaque fois que vous modifiez la liste:

MySerializableClass serializableObject = new MySerializableClass(); 
persistedObject.getMySerializableClassList().add(serializableObject); 
JDOHelper.makeDirty(persistedObject, "mySerializableClassList"); 

Note: le paramètre defaultFetchGroup = "true" est utilisé pour indiquer JDO à automatiquement récupère tous les objets de la liste et n'attend pas l'accès au champ (fetching paresseux).

1

@Persistent(serialized = "true", defaultFetchGroup="true") est l'annotation correcte.

Aussi lorsque vous changez quelque chose à un élément de la liste que vous devez appeler JDOHelper.makeDirty(this, "yourSerializedField"); parce que quand il re-sérialiser l'élément qu'il ne regarde que la référence pas chaque élément (il utilise equals de l'objet) Hope this aide