Je suis en train de charger le plein objet graphique pour l'utilisateur, qui contient une collection de ponts, qui contient alors une collection de cartes, comme tels: utilisateur:problème détachant tout le graphe d'objet dans GAE-J avec JDO
@PersistenceCapable(detachable = "true")
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
@FetchGroup(name = "decks", members = { @Persistent(name =
"_Decks") })
public abstract class User {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
protected Key _ID;
@Persistent
protected String _UniqueIdentifier;
@Persistent(mappedBy = "_Owner")
@Element(dependent = "true")
protected Set<Deck> _Decks;
protected User()
{
}
}
chaque plate-forme a une collection de cartes, en tant que tel:
@PersistenceCapable(detachable = "true")
@FetchGroup(name = "cards", members = { @Persistent(name =
"_Cards") })
public class Deck {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key _ID;
@Persistent
String _Name;
@Persistent(mappedBy = "_Parent")
@Element(dependent = "true")
private Set<Card> _Cards = new HashSet<Card>();
@Persistent
private Set<String> _Tags = new HashSet<String>();
@Persistent
private User _Owner;
}
Et enfin, chaque carte:
@PersistenceCapable
public class Card {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key _ID;
@Persistent
private Text _Question;
@Persistent
private Text _Answer;
@Persistent
private Deck _Parent;
}
J'essaye de récupérer puis de détacher tout le graphe d'objet. Je peut voir dans le débogueur qu'il se charge bien, mais quand je deviens à se détacher, je ne peux rien faire au-delà de la charge de l'objet Utilisateur. (No Decks, pas de cartes). Au début, je ai essayé sans transaction pour simplement "toucher" tous les champs sur l'objet ci-joint avant de se détacher, mais qui n'a pas aidé. Ensuite, j'ai essayé d'ajouter tout au groupe par défaut , mais cela a juste généré des avertissements à propos de GAE ne supportant pas les jointures . J'ai essayé de définir la profondeur de fetch max du plan de fetch à -1, mais qui ne l'a pas fait. Enfin, j'ai essayé d'utiliser FetchGroups comme vous pouvez le voir ci-dessus , puis récupérer le code suivant:
PersistenceManager pm = _pmf.getPersistenceManager();
pm.setDetachAllOnCommit(true);
pm.getFetchPlan().setGroup("decks");
pm.getFetchPlan().setGroup("cards");
Transaction tx = pm.currentTransaction();
Query query = null;
try {
tx.begin();
query = pm.newQuery(GoogleAccountsUser.class); //Subclass of User
query.setFilter("_UniqueIdentifier == TheUser");
query.declareParameters("String TheUser");
List<User> results = (List<User>)query.execute(ID); //ID = Supplied
parameter
//TODO: Test for more than one result and throw
if(results.size() == 0)
{
tx.commit();
return null;
}
else
{
User usr = (User)results.get(0);
//usr = pm.detachCopy(usr);
tx.commit();
return usr;
}
} finally {
query.closeAll();
if (tx.isActive())
{
tx.rollback();
}
pm.close();
}
Cela ne fonctionne pas non plus, et je suis à court d'idées ...
La modification de setGroup() pour ajouterGroup() l'a totalement corrigé. Je vous remercie! Incroyable comment je peux avoir presque tout bien et qu'une petite erreur m'a coûté des jours ... Je suppose que c'est ce qui arrive à être nouveau dans un cadre complexe. – tempy