Проблема отсоединения всего графа объектов в GAE-J с помощью JDO - PullRequest
2 голосов
/ 09 марта 2010

Я пытаюсь загрузить полный граф объектов для пользователя, который содержит коллекция колод, которая затем содержит коллекцию карт, а например: Пользователь:

@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() 
    { 
    } 
} 

Каждая колода имеет коллекцию карт, как таковую:

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

И, наконец, каждая карта:

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

Я пытаюсь получить, а затем отключить весь граф объектов. я можно увидеть в отладчике, что он загружается нормально, но потом, когда я получаю Я не могу сделать ничего, кроме загрузки объекта User. (Нет Колоды, без карт). Сначала я пытался без транзакции, чтобы просто «коснитесь» всех полей на прикрепленном объекте перед отсоединением, но это не помогло Затем я попытался добавить все в выборку по умолчанию группа, но это только что сгенерировало предупреждения о том, что GAE не поддерживает присоединяется. Я попытался установить максимальную глубину выборки плана выборки на -1, но это не делало это. Наконец, я попытался использовать FetchGroups, как вы можете видеть выше, а затем получить следующий код:

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

Это тоже не работает, и у меня заканчиваются идеи ...

1 Ответ

1 голос
/ 09 марта 2010

Я уверен, что чтение журнала (уровень отладки) скажет вам гораздо больше, так как он определенно говорит вам, когда он отключает что-то. Возможно, GAE / J не уважает ленивую загрузку при отсоединении? Сам DataNucleus отлично работает со всеми другими хранилищами данных.

Зачем вызывать FetchPlan.setGroup (), когда он перезаписывает все существующие группы? addGroup () имеет больше смысла для меня.

...