2010-11-14 9 views
37
org.hibernate.HibernateException: identifier of an instance 
of org.cometd.hibernate.User altered from 12 to 3 

de hecho, mi tabla user es realmente debe cambiar dinámicamente su valor, mi aplicación Java es multiproceso. ¿Alguna idea de cómo solucionarlo?Hibernate: ¿Cómo arreglar "identificador de una instancia alterada de X a Y"?

+0

¿Su tabla de usuario debe cambiar su valor? ¿Qué valor? La tabla de usuario presumiblemente contiene varias filas con varios valores cada ... – meriton

Respuesta

28

¿Está cambiando el valor de la clave primaria de un objeto de usuario en alguna parte? No deberías hacer eso. Verifique que su asignación para la clave primaria sea correcta.

¿Cómo se ve el archivo XML de asignación o las anotaciones de asignación?

+0

Hola Juha, tienes toda la razón, asigno la clave principal al objeto Usuario. ¡Muchas gracias por tu ayuda! – gennad

+7

Tenía algo de cierto problema. Mi mensaje de error contenía ... fue alterado de 1 a 1 ... Mi clave primairy fue establecida en long en mi clase de entidad pero fue mapeada a int en mi archivo de mapeo. –

22

Debe desprenderse de su entidad de la sesión antes de modificar sus campos de ID

+1

cómo adjuntarlo – shareef

+1

Entity Manager proporciona un método para eso. http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#detach(java.lang.Object) También puedes verificar el método clear(). – JanM

3

En mi caso particular, esto fue causado por un método en mi aplicación de servicio que necesita la primavera @Transactional(readOnly = true) anotación. Una vez que agregué eso, el problema fue resuelto. Sin embargo, era inusual, solo una declaración selecta.

13

En mi caso, el campo PK en hbm.xml era del tipo "entero" pero en el código del bean era long.

+0

Gracias, eso es exactamente lo que tenía (pero luego Int32 en lugar de Int64). –

4

En mi caso, lo resolví cambiando el tipo de campo @Id de largo a Largo.

3

En mi caso, una plantilla tenía un error tipográfico así que en lugar de verificar la equivalencia (==) estaba usando una asignación igual a (=).

Así que cambió la lógica de la plantilla:

if (user1.id = user2.id) ... 

a

if (user1.id == user2.id) ... 

y ahora todo está bien. Entonces, ¡revisa tus puntos de vista también!

3

En mi caso, los nombres getters y setter eran diferentes del nombre de la variable.

private Long stockId; 
    public Long getStockID() { 
     return stockId; 
    } 
    public void setStockID(Long stockID) { 
     this.stockId = stockID; 
    } 

donde debe estar

public Long getStockId() { 
    return stockId; 
} 
public void setStockId(Long stockID) { 
    this.stockId = stockID; 
} 
3

Asegúrese de que no está intentando utilizar el mismo objeto Usuario más de una vez mientras se cambia la ID. En otras palabras, si estaban haciendo algo en una operación de tipo discontinuo:

User user = new User(); // Using the same one over and over, won't work 
List<Customer> customers = fetchCustomersFromSomeService(); 
for(Customer customer : customers) { 
// User user = new User(); <-- This would work, you get a new one each time 
user.setId(customer.getId()); 
user.setName(customer.getName()); 
saveUserToDB(user); 
} 
+0

Gracias! Esta fue una respuesta muy útil ya que no pude separar el trabajo y esta respuesta me dio la idea de usar un nuevo objeto y copiar las propiedades al usar BeanUtils.copyProperties(). –

0

En mi caso fue porque la propiedad pasó mucho tiempo en el objeto, sino int en el xml de mapeo, esta excepción debería ser más clara

2

Estaba enfrentando este problema, también.

La tabla de destino es una tabla de relaciones, conectando dos identificadores de diferentes tablas. Tengo una restricción ÚNICA en la combinación de valores, reemplazando el PK. Al actualizar uno de los valores de una tupla, se produjo este error.

Esta es la forma en la mesa se ve como (MySQL):

CREATE TABLE my_relation_table (
    mrt_left_id BIGINT NOT NULL, 
    mrt_right_id BIGINT NOT NULL, 
    UNIQUE KEY uix_my_relation_table (mrt_left_id, mrt_right_id), 
    FOREIGN KEY (mrt_left_id) 
    REFERENCES left_table(lef_id), 
    FOREIGN KEY (mrt_right_id) 
    REFERENCES right_table(rig_id) 
); 

la clase de entidad para la entidad RelationWithUnique se ve básicamente como esto:

@Entity 
@IdClass(RelationWithUnique.class) 
@Table(name = "my_relation_table") 
public class RelationWithUnique implements Serializable { 

    ... 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "mrt_left_id", referencedColumnName = "left_table.lef_id") 
    private LeftTableEntity leftId; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "mrt_right_id", referencedColumnName = "right_table.rig_id") 
    private RightTableEntity rightId; 

    ... 

me fijo por

// usually, we need to detach the object as we are updating the PK 
// (rightId being part of the UNIQUE constraint) => PK 
// but this would produce a duplicate entry, 
// therefore, we simply delete the old tuple and add the new one 
final RelationWithUnique newRelation = new RelationWithUnique(); 
newRelation.setLeftId(oldRelation.getLeftId()); 
newRelation.setRightId(rightId); // here, the value is updated actually 
entityManager.remove(oldRelation); 
entityManager.persist(newRelation); 

Muchas gracias por la pista de la PK, simplemente me lo perdí.

0

Si está utilizando Spring MVC o la primavera de arranque tratar de evitar: @ModelAttribute ("usuario") en una controoler, y en otro controlador model.addAttribute ("usuario", userRepository.findOne (someId);

Esta situación se puede producir tales errores

1

problema puede ser también en diferentes tipos de PK del objeto ("usuario" en su caso) y el tipo le preguntas a hibernar para obtener session.get(type, id);

..

En mi caso el error fue identifier of an instance of <skipped> was altered from 16 to 32. El tipo PK del objeto era Integer, se solicitó hibernación para el tipo Long.

0

Esta es una vieja pregunta, pero voy a agregar la solución para mi problema particular (Spring Boot, JPA usando Hibernate, SQL Server 2014) ya que no coincide exactamente con las otras respuestas incluidas aquí:

Tenía una clave externa, por ejemplo my_id = '12345', pero el valor en la columna referenciada fue my_id = '12345'. Tenía un espacio adicional al final que no le gustó a hibernar. Eliminé el espacio, arreglé la parte de mi código que permitía este espacio adicional y todo funciona bien.

Cuestiones relacionadas