Problème détachant tout le graphe d'objet dans GAE-J avec JDO
-
18-09-2019 - |
Question
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 tel: Utilisateur:
@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;
}
Je suis en train de récupérer, puis détacher l'ensemble graphique d'objets. je peut voir dans le débogueur qu'il se charge très bien, mais quand j'arrive à détacher, je ne peux pas faire quoi que ce soit au-delà de la charge de l'objet utilisateur. (Non Les ponts, pas de cartes). Au début, j'essayé sans une transaction simplement « Toucher » tous les champs de l'objet attaché avant de détacher, mais cela n'a pas aidé. Ensuite, j'ai essayé d'ajouter tout à la valeur par défaut chercher groupe, mais que vient de générer des avertissements sur GAE ne supportant pas jointures. J'ai essayé la mise à -1, la profondeur de chercher un plan, mais aller chercher max qui ne le faisaient pas. 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 solution
Je lis que du journal (niveau de débogage) vous dira de façon plus, car il vous dit certainement quand il est des choses détachait. Peut-être GAE / J ne respecte pas le chargement paresseux à Détacher? DataNucleus lui-même fonctionne très bien, avec tous les autres magasins de données.
Pourquoi faire appel FetchPlan.setGroup () lorsque que tous les groupes existants écrase? AddGroup () est plus logique pour moi.