Операция обновления и удаления Datanucleus JPA

#jpa #datanucleus #force.com

#jpa #datanucleus #force.com

Вопрос:

Я использую Datanucleus в качестве JPA-движка для выполнения CRUD для объекта в Force.com База данных. Вставка и выбор работают нормально, но при обновлении создается новая строка, а удаление вообще не удаляет запись. Я использую следующее для принудительного выполнения транзакций

Существует ли какая-либо проблема с прокси-объектом для фактической синхронизации объекта после того, как объект был извлечен, изменен и затем подлежит обновлению.

Похоже, что, поскольку уровень ORM (datanucleus force sdk) не может соответствовать измененному объекту и исходному, он приземляется, создавая новую строку.

Любая помощь высоко ценится.

Спасибо

Комментарии:

1. Ну, вы используете Salesforce.com собственный плагин DataNucleus для их хранилища данных. Это не AFAIK с открытым исходным кодом, и вам лучше спросить их. Журнал любого использования DataNucleus расскажет вам о многом, так что, возможно, взгляните на него 😉

2. У меня та же проблема, даже если я не использую Force.com

Ответ №1:

Было бы полезно, если бы вы могли опубликовать свой код. Но я предполагаю, что вы, возможно, столкнулись с известной разницей в поведении между DataNucleus и другими ORM, такими как Hibernate.

Вы делаете что-то подобное?

 MyEntity ent = new MyEntity();
ent.setId(idFromWebRequest);
ent.setXXX(valueFromWebRequest);
ent = entityManager.merge(ent);
  

(где создание экземпляра и установщики могут выполняться механизмом привязки данных, таким как Spring MVC). Если вы сделаете это подобным образом, это не будет работать с DataNucleus, но будет работать с гибернацией. Для DataNucleus вы должны вместо этого выполнить:

 MyEntity ent = entityManager.find(MyEntity.class, idFromWebRequest);
ent.setXXX(valueFromWebRequest);
ent = entityManager.merge(ent);
  

Я бы предпочел, чтобы это работало как режим гибернации, но команда DataNucleus считает, что это правильное поведение. Может быть, они смогут подключиться. Я полагаю, что это вопрос того, когда вы рассматриваете объект как новый объект, а не как отдельный объект. Если ваш экземпляр entity отсоединен, то вызов merge для него должен повторно подключить его, и строка вашей базы данных будет обновлена при фиксации / сбросе транзакции. Если это новый экземпляр, то диспетчер объектов всегда будет создавать новую запись.

Что касается вашей проблемы с удалением, я не знаю, что это может быть. Возможно, вы можете опубликовать пример кода? Вы можете найти полный пример приложения CRUD с использованием поставщика JPA здесь:

https://github.com/forcedotcom/javasample-musiclib

Комментарии:

1. Очевидно, что DataNucleus следует спецификации JPA (и передает ее). Если объект, переданный для «слияния», является «временным» (т.Е. не постоянным и не отсоединенным), то он сохраняется (как новый). Вы можете получить «отсоединенный», только вызвав функцию detach() или закрыв EntityManager. Если кто-нибудь хотел бы потратить свое время на внедрение datanucleus.org/servlet/jira/browse/NUCCORE-595 тогда у них могла бы быть возможность такого другого поведения. Поскольку VMforce фактически является коммерческой, извлекая выгоду из DataNucleus, но пока не внося в нее свой вклад, то это их выбор, если они хотят эту функциональность, известную как open source.

2. Database.com SDK имеет открытый исходный код: github.com/forcedotcom/java-sdk . Я почти уверен, что Фиаз Хоссейн вернул исправления для DataNucleus.

3. Джеспер, спасибо за ссылку, теперь, когда вы сделали ее открытым исходным кодом; надеюсь, все пройдет хорошо. Я обновлю документы DN, чтобы дать на них ссылку. Fiaz поднял 3 проблемы в DN JIRA, и единственное, что я получил от него, было непроверенное предложение по одной из проблем, и я не получал исправлений ни от кого другого, кто, как я знаю, связан с Salesforce. Спасибо за проявленный интерес