Tengo un objeto de usuario que tiene una relación uno a muchos con tipos de cadenas. Creo que son mapeos simples. La tabla de tipos contiene el nombre de usuario asociado y los nombres de tipo de variable, con una clave principal 'id' que básicamente es un contador.Hibernar Guardar comportamiento extraño
<class name="Users" table="users">
<id column="id" name="id" />
...
<set name="types" table="types" cascade="save-update">
<key column="id" />
<one-to-many class="Types" />
</set>
</class>
<class name="Types" table="types">
<id column="id" name="id" />
<property column="user_id" name="user_id" type="integer" />
<property column="type" name="type" type="string" />
</class>
Este es el java utilicé para añadir a la base de datos:
User u = new User();
u.setId(user_id);
...
Collection<Types> t = new HashSet<Types>();
t.add(new Type(auto_incremented_id, user_id, type_name));
u.setTypes(t);
getHibernateTemplate().saveOrUpdate(u);
Cuando lo ejecuto, se da este error:
61468 [http-8080-3] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1062, SQLState: 23000
61468 [http-8080-3] ERROR org.hibernate.util.JDBCExceptionReporter - Duplicate entry '6' for key 'PRIMARY'
61468 [http-8080-3] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Cuando compruebo el SQL, muestra:
Hibernate: insert into users (name, id) values (?, ?)
Hibernate: insert into types (user_id, type, id) values (?, ?, ?)
Hibernate: update types set id=? where id=?
- ¿Por qué Hibernate intenta actualizar la identificación de los tipos?
El error dice: Duplicar la entrada '6' para la clave 'PRIMARY', pero realmente no? Me aseguré de que los identificadores se incrementaran cada vez. Y los usuarios y tipos se agregan a la base de datos correctamente.
He registrado la información que entra, y los tipos agregados tienen un id de 7 y una identificación de usuario de 6. Podría ser que Hibernate tomara el user_id de 6 y tratara de actualizar los tipos y estableciera id = 6 donde id = 7? Por lo tanto, ¿el error duplicado de la clave primaria?
¿Pero por qué haría algo tan extraño? ¿Hay alguna manera de evitar que se actualice?
- ¿Debo configurar el ID manualmente? Si no, ¿cómo debería agregar los tipos? Da otros errores cuando agrego un tipo de objeto que solo tiene una cadena de tipo y sin identificadores.
Gracias chicos. Ha estado reflexionando sobre ello durante días ...
pegado con colección de elementos! ¡Gracias! – April