Почему JDO считает этот отдельный объект чистым? - PullRequest
0 голосов
/ 21 декабря 2010

Я пытаюсь изучить JDO (и в то же время его тонкости GAE и Spring), создав небольшое веб-приложение, и у меня возникают проблемы с получением обновленных доменных объектов для сохранения обратно в базу данных.Сначала я извлекаю сущность из БД и отсоединяю ее, чтобы показать ее пользователям и позволить им изменить ее.После того, как пользователь внес изменения и отправил форму обратно в приложение, я снова извлекаю сущность из БД (отсоединена), обновляю ее свойства и затем вызываю pm.makePersistent().Сокращенный код выглядит следующим образом:

Объект домена пользователя:

@PersistenceCapable(detachable="true")
public class User extends BaseEntity {
    @Persistent
    private String firstName = "";
    @Persistent
    private String middleInitial = "";
    @Persistent
    private String lastName = "";
}

Метод чтения DAO:

public User read(Key key) throws DataException {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    User pkg, detached = null;
    try {
        pkg = (User) pm.getObjectById(User.class, key);
        detached = pm.detachCopy(pkg);
        detached.setIsAlreadyInDB(true);
    }
    catch (Exception e) {           
        throw new DataException("An error occured trying to read the User object. Details:\n" + e.getMessage());
    }
    finally {
        pm.close();
    }
    return detached;
}

Метод обновления DAO:

private void update(User pkg) throws DataException {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    Transaction tx = pm.currentTransaction();

    try { 
        tx.begin();         
        pm.makePersistent(pkg);
        tx.commit();
    }
    finally { 
        if (tx.isActive()) tx.rollback();
        pm.close();
    }
}

Теперь, когда я знакомлюсь с методом обновления, я доказал себе, что я работаю с тем же объектом из моего чтения, проверяя его hashCode(), я изменил значение с помощью метода установки объекта домена.Я даже вывел измененное значение на консоль, чтобы убедиться, что оно завершено, и JDOHelper.isDirty() по-прежнему возвращает false, и поэтому ни одно из изменений не сохраняется обратно в базу данных.Есть мысли о том, что мне не хватает или я подхожу к этому с неправильной точки зрения?Спасибо за помощь начинающему JDO!

1 Ответ

1 голос
/ 21 декабря 2010

JDOHelper.isDirty - для управляемых объектов. Отдельный объект не управляется. DataNucleus предоставляет собственный вспомогательный метод для извлечения грязных полей при отсоединении, поскольку логика зависит от реализации String [] dirtyFieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields (obj, pm);

...