Pregunta

He creado una aplicación Spring Roo, set de persistencia para OpenJPA y creó algunas entidades. Volví a colocar Spring MVC con Apache Wicket. Cosas parece estar funcionando bien y he representada con éxito una lista de entidades del cliente.

El siguiente paso fue la vista de edición para el cliente. Por ahora he hecho una forma peatonal incorporada que utiliza la entidad OpenJPA directamente como el modelo de la forma, y ??por lo tanto tuve que hacer la clase de entidad implementar Serializable.

Ahora, no estoy seguro de cómo implementar correctamente la persistencia OpenJPA, lo que tengo ahora es la siguiente:

@Override
protected void onSubmit() {
    try {
        if (customer.getId()!=null) {
            customer.merge();
        }
        else {
            customer.persist();
        }
    }
    catch (Exception e) {
        throw new Error(e);
    }
    super.onSubmit();
}

Esto funciona, pero sólo una vez por cliente objetivo. De alguna manera. Es decir, presento mi formulario una vez y funciona tanto con un nuevo cliente (.persist ()) y un cliente existente (.merge ()). Sin embargo, presento el formulario de nuevo para el mismo cliente me sale este error (he añadido algunos saltos de línea aquí):

<openjpa-2.0.0-r422266:935683 nonfatal store error>
org.apache.openjpa.persistence.OptimisticLockException:
An optimistic lock violation was detected when flushing object instance "no.magge.iumb.domain.crm.PrivateCustomer-379" to the data store.
This indicates that the object was concurrently modified in another transaction.

Mi pregunta es, ¿cuál es la forma correcta de persistir con OpenJPA y por qué estoy recibiendo este error?

Wicket-sabia: ¿Debería haber creado una separada Wicket IModel con un modelo cliente desmontable y podría ser la razón que tengo estos problemas

?

Muchísimas gracias por cualquier consejo!

¿Fue útil?

Solución

Hágase un favor y separar las capas de aplicación. Código en una vista no debería nunca tener acceso a una base de datos.

Crea una capa de servicio y / o una capa de Dao, prueba de la unidad el código de esas capas para ver que se está trabajando y luego inyectar un objeto DAO o servicio en el componente wicket. (Recomiendo que use la primavera para eso, pero también puede hacerlo de forma manual)

Con su escenario, hay tantas cosas diferentes que pueden fallar en un punto, y es casi imposible separarlos.

Aquí están algunos consejos:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top