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 ...

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top