Problema con el método saveorUpdate de hibernación

Estoy tratando de trabajar con Hibernate (lado de la base de datos por primera vez) y de alguna manera me impresionó elegir la mejor manera posible de usar saveOrUpdate o Save.Update Tengo una clase POJO de destino y sus otros atributos que deben actualizarse junto con el Destino entidad. Obtengo un archivo XML para importar y estoy usando el siguiente código para actualizar / guardar la entidad de destino junto con sus clases de atributos.

try{
        getSessionFactory().getCurrentSession().beginTransaction();
        getSessionFactory().getCurrentSession().saveOrUpdate(entity);
        getSessionFactory().getCurrentSession().getTransaction().commit();
        }
        catch(Exception e){
            getSessionFactory().getCurrentSession().getTransaction().rollback();
        }
        finally{
            getSessionFactory().close();
        }

todo funciona bien hasta que estoy usando la misma instancia de sesión. pero más adelante, cuando estoy usando el mismo archivo XML para actualizar la PO de destino para ciertos atributos, me da el siguiente error.

SEVERE: Duplicate entry 'MNLI' for key 'DESTINATIONID'
9 Jan, 2011 4:58:11 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)

Estoy usando UUID como clave principal para la tabla de destino y en la tabla de destino tengo una identificación de destino que es única. pero puedo entender que en el segundo caso, hibernate no puede encontrar si ya hay una entrada para el mismo destino en la base de datos y tratando de ejecutar la instrucción de inserción en lugar de actualizar.

Una posible solución es que puedo usar el identificador de destino del usuario para verificar si ya existe un destino en el lugar con el identificador dado y, en función de los resultados, puedo emitir el comando guardar o actualizar. mi pregunta es, ¿se puede lograr esto de alguna otra manera ...?

Gracias por adelantado

preguntado el 09 de enero de 11 a las 12:01

¿Hay alguna razón para no tener la sesión getSessionFactory (). getCurrentSession () en una variable? -

estás haciendo una sesión. Guardar () ?? -

@ User350374; usando este método solo para fines de prueba, solo estoy usando saveOrUpdate () -

1 Respuestas

Semántica de saveOrUpdate() La operación es la siguiente (ver 11.7. Detección automática de estado):

  • si el objeto ya es persistente en esta sesión, no haga nada
  • si otro objeto asociado con la sesión tiene el mismo identificador, lanza una excepción
  • si el objeto no tiene propiedad de identificador, guárdelo ()
  • si el identificador del objeto tiene el valor asignado a un objeto recién instanciado, guárdelo ()
  • si el objeto está versionado por una o, y el valor de la propiedad de versión es el mismo valor asignado a un objeto recién instanciado, guárdelo ()
  • de lo contrario, actualice () el objeto

Por lo tanto, parece que la clave principal o el valor de la versión se pierden durante la importación del archivo XML.

Respondido el 09 de enero de 11 a las 16:01

sí, ya que estamos obteniendo XML del sistema de terceros, por lo que no hay posibilidad de obtener la clave principal y sé poco sobre el valor de la versión, sé que podemos controlar el uso de esto, pero no estoy seguro de cómo hacerlo ... también he revisado el documento pero todavía no tengo claro cómo manejar mi caso, ya que no estoy seguro de cuándo obtendremos el segundo XML para la actualización. - Umesh Awasthi

@umesh: si su XML no tiene una clave principal y está identificado por la identificación de destino, entonces sí, primero debe determinar la clave principal del objeto existente con la misma identificación de destino. - axtavt

Gracias, solo estaba pensando en alguna otra forma en que podemos hacer esto con algún truco de control de versiones, como una marca de tiempo enviada por el XML de terceros: Umesh Awasthi

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