Operación de actualización y eliminación de Datanucleus JPA

Estoy usando Datanucleus como motor JPA para realizar CRUD en una entidad en Force.com DB. Insertar y Seleccionar funcionan bien, pero mientras se actualiza una nueva fila se crea y eliminar no elimina el registro en absoluto. Estoy usando lo siguiente para la ejecución de transacciones

¿Existe algún problema con el objeto proxy para la sincronización del objeto real después de que el objeto ha sido obtenido, modificado y luego sujeto a actualización?

Parece que como la capa ORM (datanucleus + force sdk) no puede coincidir entre el objeto alterado y el original, está aterrizando creando una nueva fila.

Cualquier ayuda es muy apreciada.

Muchas Gracias

preguntado el 10 de mayo de 11 a las 13:05

Bueno, está utilizando el propio complemento DataNucleus de Salesforce.com para su almacén de datos. No es AFAIK de código abierto y será mejor que les pregunte. El registro de cualquier uso de DataNucleus le dice mucho, así que quizás mírelo ;-) -

Tengo el mismo problema incluso si no estoy usando Force.com -

1 Respuestas

Sería útil si pudiera publicar su código. Pero supongo que podría estar encontrando una diferencia conocida en el comportamiento entre DataNucleus y otros ORM como Hibernate.

¿Estás haciendo algo como esto?

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

(donde la creación de instancias y los establecedores pueden llevarse a cabo mediante un mecanismo de enlace de datos como Spring MVC). Si lo hace así, será no es trabajar con DataNucleus pero trabajar con Hibernate. Para DataNucleus, debe hacer en su lugar:

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

Preferiría que funcionara como Hibernate, pero el equipo de DataNucleus cree que este es el comportamiento correcto. Tal vez puedan intervenir. Creo que es una cuestión de cuándo se considera una entidad como una entidad nueva frente a una entidad separada. Si su instancia de entidad está separada, entonces llamar a merge debería volver a adjuntarla y la fila de su base de datos se actualizará en la transacción confirmada / flush. Si es una instancia nueva, el administrador de la entidad siempre creará un nuevo registro.

En cuanto a su problema de eliminación, no sé qué podría ser. ¿Quizás puedas publicar una muestra de código? Puede encontrar una aplicación de muestra CRUD completa utilizando el proveedor JPA aquí:

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

contestado el 18 de mayo de 11 a las 20:05

Obviamente, DataNucleus sigue la especificación JPA (y la pasa). Si un objeto que se pasa a "fusionar" es "transitorio" (es decir, no es persistente ni está separado), se conserva (como nuevo). Solo puede "desconectarse" llamando a detach () o cerrando un EntityManager. Si alguien quisiera contribuir con su tiempo para implementar datanucleus.org/servlet/jira/browse/NUCCORE-595 entonces podrían tener la opción de este otro comportamiento. Dado que VMForce es efectivamente comercial, se beneficia de DataNucleus pero no contribuye hasta ahora, entonces es su elección si quieren esa funcionalidad, también conocida como código abierto. - DataNucleus

El SDK de Database.com es de código abierto: github.com/forceotcom/java-sdk. Estoy bastante seguro de que Fiaz Hossain ha contribuido con parches a DataNucleus. - Jesper J.

Jesper, gracias por el enlace ahora que lo ha hecho de código abierto; Espero que vaya bien. Actualizaré los documentos DN para vincularlos. Fiaz ha planteado 3 problemas en DN JIRA, y lo único que recibí de él fue una propuesta no verificada para uno de los problemas, y no he recibido parches de nadie más que sepa que esté afiliado a Salesforce. Gracias por tu interés - DataNucleus

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.