Problema separar toda gráfico de objetos en GAE-J con JDO
-
18-09-2019 - |
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 ...
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í.