Pregunta

Estoy tratando de cargar el gráfico de objetos completa para el usuario, que contiene una colección de cubiertas, que a su vez contiene una colección de tarjetas, como tal: Usuario:

@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 cubierta tiene una colección de tarjetas, como por ejemplo:

@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; 
} 

Y, por último, cada tarjeta:

@PersistenceCapable 
public class Card { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key _ID; 
   @Persistent 
    private Text _Question; 
    @Persistent 
    private Text _Answer; 
    @Persistent 
    private Deck _Parent; 
} 

Estoy tratando de recuperar y luego separar todo el gráfico de objetos. yo puede ver en el depurador que se cargue bien, pero luego cuando llegue a separar, no puedo hacer nada más allá de la carga objeto de usuario. (No Cubiertas, sin tarjetas). Al principio traté sin una transacción simplemente "Tocar" todos los campos en el objeto adjunto antes de desconectar, pero eso no ayudó. Entonces intentado añadir todo lo que el valor por defecto traiga grupo, pero que las advertencias generadas solo unos GAE no apoyar Uniones. He intentado establecer la profundidad máxima se ha podido recuperar el plan de ir a buscar a -1, pero que no lo hizo. Por último, he intentado usar FetchGroups como se puede ver arriba y, a continuación, recuperar con el código siguiente:

    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(); 
            } 

Esto también no funciona, y estoy quedando sin ideas ...

¿Fue útil?

Solución

Estoy seguro de lectura del registro (nivel de depuración) le diría mucho más, ya que sin duda te dice cuando se desprendía cosas. Tal vez GAE / J no está respetando la carga diferida en la desconexión? DataNucleus sí funciona bien, con todos los otros almacenes de datos.

¿Por qué llamar FetchPlan.setGroup () cuando que sobrescribe todos los grupos existentes? addgroup () tiene más sentido para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top