Problema destacando gráfico objeto inteiro em GAE-J com JDO
-
18-09-2019 - |
Pergunta
Eu estou tentando carregar o objeto gráfico completo para o usuário, que contém uma recolha de pavimentos, que então contém um conjunto de cartões, tal como tal: Usuário:
@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()
{
}
}
Cada plataforma tem uma coleção de cartões, tais como:
@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;
}
E, finalmente, cada cartão:
@PersistenceCapable
public class Card {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key _ID;
@Persistent
private Text _Question;
@Persistent
private Text _Answer;
@Persistent
private Deck _Parent;
}
Eu estou tentando recuperar e, em seguida, retire todo o gráfico do objeto. Eu pode ver no depurador que ele carrega bem, mas, em seguida, quando eu chegar ao destacando, eu não posso fazer nada além da carga objeto Usuário. (Não Decks, sem cartões). No começo eu tentei sem uma transação simplesmente "toque" todos os campos no objeto anexado Antes de desligar, mas que não ajuda. Então eu tentei adicionar tudo para o padrão buscar grupo, mas que as advertências apenas gerados cerca de GAE não apoiar junta. Tentei configurar máximo do plano de buscar buscar profundidade para -1, mas que não fazê-lo. Finalmente, eu tentei usar FetchGroups como você pode ver acima, e depois recuperar com o código a seguir:
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();
}
Isso também não funciona, e eu estou correndo fora das idéias ...
Solução
Estou certo de leitura do log (nível de depuração) iria dizer-lhe forma mais, uma vez que certamente lhe diz quando é separar as coisas. Talvez GAE / J não está respeitando o carregamento lento a desanexar? -se DataNucleus fina funciona, com todos os outros armazenamentos de dados.
Por chamada FetchPlan.setGroup () quando que substitui todos os grupos existentes? AddGroup () faz mais sentido para mim.