Как использовать JDO (DataNucleus) для обновления и удаления данных? - PullRequest
0 голосов
/ 31 августа 2010

Я создал небольшой проект, используя apache.JDO / w DataNucleus.Я могу сохранить данные без каких-либо проблем, но я застрял при попытке обновить или удалить их.

Сценарий следующий:

  1. Я создаю объект и сохраняю его, он получает и id
     @PrimaryKey  
     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
     private Long id;  
Я закрываю PersistenceManager В приложении я изменяю свой объект (Transient) Я пытаюсь снова сохраниться (поле id тоже самое), но вместо обновления это приводит ксоздание нового объекта

В Google App Engine тот же сценарий дал мне обновление (ожидаемые результаты - см. ниже).

Я также дам вам небольшой пример кода, чтобы проиллюстрировать мою проблему:

        PersistenceManager pm = PMF.getPM();
        Option dao = new Option(String.class, "field", "A");
        pm.makePersistent(dao);
        pm.close();

        System.out.println("1");
        for (Object o : Model.findAll(Option.class))
            System.out.println(((Option) o).getValue());

        dao.setValue("B");

        pm = PMF.getPM();
        pm.makePersistent(dao);
        pm.close();

        System.out.println("2");
        for (Object o : Model.findAll(Option.class))
            System.out.println(((Option) o).getValue());

        pm = PMF.getPM();
        pm.makePersistent(dao);
        pm.deletePersistent(dao);
        pm.close();

        System.out.println("3");
        for (Object o : Model.findAll(Option.class))
            System.out.println(((Option) o).getValue());

Я ожидаю, что результат будет:

1
A
2
B
3

Но вместо этого он даетя:

1
A
2
A
B
3
A
B

Есть предложения, что я делаю не так?(кстати, я использую нетранзакционную RW с включенным RetainValues)

Ответы [ 2 ]

0 голосов
/ 01 января 2018

Вам не нужно звонить makePersistent agian.

long id = objectId; //Id of the object you want to update.

pm = PMF.getPM();

DO dao = pm.getObjectById(DO.class, id);
dao.setValue("B");

pm.close();

Для удаления сделайте это;

long id = objectId; //Id of the object you want to delete.
pm = PMF.getPM();

DO dao = pm.getObjectById(DO.class, id);
pm.deletePersistent(dao);

pm.close();

Вы не используете транзакцию для фиксации. Вы можете посмотреть на DataNucleus документы

0 голосов
/ 04 сентября 2010

Я решил свою проблему (@point 2)

pm = PMF.getPM();
dao = pm.getObjectById(DO.class, 1L);
dao.setValue("B");
pm.makePersistent(dao);
pm.close();

Но это решение несколько дорого, если у меня 70-100 полей, потому что я должен устанавливать каждое поле отдельно.

Я делал это не вручную, а с размышлениями - но в чем же преимущество DataNucleus перед Hibernate? - который (насколько я знаю) также использует интроспекцию во время выполнения.

Пожалуйста, поправьте меня, если я ошибаюсь - я все еще новичок в этой области ... пока:)

...