2012-04-23 22 views
15

Tengo dos entidades: PlayerProfileEntity & UserInfoEntity tengo una unión en userInfoEntity & PlaterProfileEntity y salvar mi registro en la base de datos de esta manera:objeto hace referencia a una instancia transitoria no guardado: guardar la instancia transitoria antes de enjuagar

Session session = sessionFactory.openSession(); 
Transaction tr = session.beginTransaction(); 
Criteria crit = session.createCriteria(PlayerProfileEntity.class); 
player.setUserId(new UserInfoEntity()); 
player.getUserId().setAddress(user.getUserId().getAddress()); 
session.save(player); 
tr.commit(); 

I utilizado este assosiation en mi clase PlayerProfileEntity

@ManyToOne (fetch = FetchType.LAZY) 
@Cascade({CascadeType.REFRESH}) 
@JoinColumn(name="userid") 

estoy recibiendo este error:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save  the transient instance before flushing: com.shared.entity.UserInfoEntity 

Nota: Si uso CascadeType.ALL, me sale este error:

Cannot add or update a child row: a foreign key constraint fails 

Alguna idea de cómo puedo solucionar este

Gracias

Respuesta

20

El TransientObjectException aparece cada vez que intenta guardar el objeto sin guardar las combinaciones adecuadas. Debe guardar e primero UserInfoEntity y luego puede guardar su clase PlayerInfoEntity.

player.setUserId(new UserInfoEntity()); 

Al utilizar este está asignando particular, UserInfoEntity-PlayerInfoEntity. Pero UserInfoEntity no tiene ningún ID. ¿Cómo se mapearán ambos? Es por eso que viene la excepción.

Espero que te ayude.

+0

gracias, puede guiar cómo puedo guardar userInfoEntity – user1226162

2

Se debe utilizar la CascadeType.PERSIST o CascadeType.ALL

+0

gracias, pero ya estoy usando CascadeType.ALL, como se menciona en mi pregunta y aparece el error: No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa, cualquier idea sobre eso – user1226162

+0

Lo siento, no lo hice t ver la nota al final. Creo que, sin embargo, deberíamos concentrarnos en ese error que obtienes con CascadeType.ALL. –

+0

Muestra una línea que incluye 'Criteria', pero es irrelevante para su código. Por otro lado, falta un código importante que ensambla el 'Player' que vas a guardar. Además, esta línea me confunde: 'player.getUserId(). SetAddress (user.getUserId().getAddress()) '¿Qué sentido tiene eso? ¿Y cómo es que UserId es un objeto compuesto? –

-1

Bueno,

tuve problema simmilar y lo que hice fue

Object tmp = session.get(Object.class,ob.getId()) 
if(tmp!=null){ 
    session.evit(tmp); // or merge 
} 
session.saveOrUpdate(ob); 

Esto funcionó para mí.

Obtiene el objeto transitorio y lo expulsa o lo fusiona.

Ahora use el método de guardar o actualizar para guardar su nuevo objeto.

+1

Necesita explicar más acerca de esta solución. ¿Cómo el desalojo y el ahorro resuelven este problema? Normalmente, este problema es causado por * no * guardar una entidad adjunta a la actual que se está guardando. –

1
public void savePlayerMethod(PlayerInfoEntity player){ 

if(player == null){ 
    player = new PlayerInfoEntity(); 
} 
player.setUserId(getSavedUserInfo()); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 

public UserInfoEntity getSavedUserInfo(){ 
UserInfoEntity userInfo = new UserInfoEntity(); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 
0

me encontré con el mismo error en este momento, cuando se trata de almacenar un objeto no salvo que tenía un ID asignado a través de la Sesión # método save(). Creo que el problema podría ser que a su gráfico de objetos no guardados ya se le ha dado una identificación (que es algo que el método save intenta hacer), y esto de alguna manera arruina la cascada del método save. Intente utilizar Session # persist(), en lugar de eso, cascade debería funcionar con esto, aunque al objeto ya se le haya asignado un id.

Cuestiones relacionadas