2009-06-25 8 views
6

estoy recibiendo la siguiente excepción cuando trato de actualizar un objeto:Hibernate Excepción ayuda: TransientObjectException

org.hibernate.TransientObjectException: objeto referencia a una instancia transitoria no salva - guardar la instancia transitoria antes de lavar: .... ..

¿Alguien puede ayudar?

El objeto que estoy tratando de actualizar tiene el atributo 'lazy' establecido en falso en el archivo de mapeo. Parece que Hibernate espera que guarde los objetos secundarios antes de que se vacíe la actualización ???

EDITAR (Añadido):

<hibernate-mapping> 
    <class name="utils.message.Message" table="messages"> 
     <id name="id" column="message_id"> 
      <generator class="native" /> 
     </id> 
     <property name="message_text" column="message_text" /> 
     <property name="message_file" column="message_file" /> 
     <property name="is_active" column="is_active" type="boolean"/> 
     <property name="is_global" column="is_global" type="boolean"/> 
     <property name="start" column="start" type="java.util.Date"/> 
     <property name="end" column="end" type="java.util.Date"/> 
     <property name="last_updated" column="last_updated" type="java.util.Date"/>  

     <many-to-one name="last_updated_by" class="utils.user.User" column="last_updated_by" lazy="false"/> 
     <many-to-one name="healthDepartment" class="utils.healthdepartment.HealthDepartment" column="health_department_id" lazy="false"/> 

    </class> 
</hibernate-mapping> 
+0

parece que el uso de la propiedad en cascada en el archivo de mapeo podría resolver mi problema ?? simplemente no estoy seguro de qué estilo es apropiado para mí. (Aunque creo que usar solo eliminar-huérfano sería lo que necesito). puede ser un poco difícil de entender los documentos de hibernación desde la perspectiva de un novato. – Rafael

+0

¿Puedes publicar partes relevantes de tu archivo de mapeo hibhernate o anotaciones? – skaffman

Respuesta

0

La aplicación se encuentra en un entorno de primavera. Solución: para ejecutar la actualización desde el entorno de Hibernate.

+0

¿Qué significa esto? ¿Cómo es esta una respuesta? –

15

TransientObjectException se produce cuando se guarda un objeto que hace referencia a otro objeto que es transitoria (que significa que tiene el valor de identificador "por defecto", con frecuencia nulo) y luego enjuagar la sesión. Esto sucede comúnmente cuando está creando un gráfico completo de objetos nuevos, pero no los ha guardado explícitamente. Hay dos formas de evitar esto:

  1. Como sugiere, puede usar la cascada de salvados a otros objetos asociados. Sin embargo, la conexión en cascada no fue pensada como una solución para TOE, sino como una conveniencia para guardar un grupo de objetos relacionados que a menudo se manipulan juntos. Si separa los objetos sin su conjunto completo de datos asociados y luego los guarda con la conexión en cascada activada, puede eliminar inadvertidamente los datos que no desea perder.
  2. Asegúrese de que todos los objetos transitorios en su gráfico se guarden explícitamente como parte de su unidad de trabajo. Esto es realmente solo un caso de entender cómo su aplicación creará un gráfico de objetos y qué entidades son transitorias y cuáles pueden ser persistentes o desapegadas.

Yo recomendaría leer este capítulo entero de la documentación de Hibernate para entender completamente la terminología de transitoria, persistente y distante:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html

+1

La URL anterior está rota; aquí está el nuevo @ http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html – ManuPK

0

Con una relación de varios a uno, no lo haría sea ​​apropiado para Hibernate para las operaciones de persistencia en cascada, ya que el "uno" es conceptualmente una entidad compartida entre muchos otros. Este tipo de relación no es un "objeto infantil", como usted dice.

Puede anular este comportamiento estableciendo explícitamente el atributo de cascada en la relación, o puede persistir manualmente en el otro extremo de las relaciones de varios a uno.

+0

Skaffman, Gracias por la aclaración. Acabo de leer el documento sugerido por brd6644. Ayudó a comprender mejor algunos conceptos fundamentales de Hibernate. En última instancia, lo que necesito ayuda para saber cómo actualizar un mensaje sin poner en cascada la operación para el usuario/HD asociado con el mensaje. – Rafael

3

dude use property "cascade = true" en el mapeo. Todos serán así ... V-Boy

Cuestiones relacionadas