Mi proyecto está utilizando hibernate con spring transaction manager y mi base de datos es postgres (podría ser irrelevante).manejo de la restricción de base de datos hibernate
Estoy tratando de leer grandes archivos xml y construir objetos a partir de ellos (los objetos no son grandes, pero la cantidad es) e insertarlos en la base de datos.
Si, por casualidad, uno de mis objetos infringe la restricción de la base de datos, todo el proceso se detiene. ¿Cómo puedo omitir los que violan la restricción de la base de datos? alternativamente, ingrese su identificación o lo que sea a un archivo de registro?
actualización Pregunta:
He estado navegando a través SO y se encontró que para las inserciones lotes se recomienda mejor usar sesión sin estado, pero sigo teniendo el mismo problema y el inserto se detiene:
May 26, 2012 4:45:47 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "UN_FK"
Detail: Key (fid)=(H1) already exists.
Aquí están las partes relevantes de mi código para analizar xml e insertar en db, para simplificar, supongamos que estoy insertando películas:
//class field
@Autowired
private SessionFactory sessionFactory;
@Override
public void startDocument() throws SAXException {
session = sessionFactory.getCurrentSession();
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("FILM")) {
movie.setCategory(category);
movie.setAdded(new Date());
session.insert(movie);
}
}
I y tengo esta propiedad configurada en la aplicación-ctx hibernate.jdbc.batch_size
a 100. ¿Es realmente necesario seleccionar antes de insertar para evitar esto?
Actualización 2:
Si uso StatelessSession
en lugar de la sesión, me sale cerca de 20 insertos y de las paradas de procesamiento indefinidamente sin excepción alguna ni nada.
Supongo que el número 20 se debe a que estoy agrupando conexiones con tomcat y tengo maxActive="20"
.
Bounty Actualización:
me encantaría ver a alguien solución de oferta (sin defensiva seleccione si es posible). Usando statelessSession o solo sesión.
Una declaración de intento de captura simple no es suficiente. Una vez que Hibernate lanza una excepción, el estado de la sesión es incoherente, la transacción debe revertirse y la sesión se cierra. Además, la excepción solo se producirá en el momento del enjuague, mucho después de que se haya conservado el registro defectuoso. –
Es por eso que se recomienda utilizar una sesión de hibernación sin estado para tales casos. Evitará el estado incoherente y también reducirá el consumo de memoria (o no tendrá que expulsar a las entidades ya tratadas) –