Hibernate ERRO Transient

7 respostas
mkaule

Pessoal alguém poderia me ajudar?
Pois estou levando esse erro na cara: Save_HibernateDAO: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.ucb.projetofinal.model.MotoristaBean
E não consigo resolver, pois tentei mapear com anotation @cascade e ele reclama do seguinte erro :Type mismatch: cannot convert from CascadeType to CascadeType[]

@Embeddable
public class VeiculoMotoristaPK implements Serializable{
	 
	@ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST)
	@JoinColumn(name="id_veiculo")
	private VeiculoBean veiculoBean;
	
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_motorista")
	private MotoristaBean motoristaBean;
//getters and setters
@Entity
@Table(name="veiculo_motorista")
public class VeiculoMotorista {
	
	@EmbeddedId
	private VeiculoMotoristaPK chaveComposta;
	
	
	@Column
	@Temporal(TemporalType.DATE)
	private Date data;

7 Respostas

mkaule

Fiz isso e ele, continua dando erro de TransientObjectException

@Embeddable
public class VeiculoMotoristaPK implements Serializable{
	 
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_veiculo")
	@Cascade(CascadeType.PERSIST)
	private VeiculoBean veiculoBean;
	
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="id_motorista")
	@Cascade(CascadeType.PERSIST)
	private MotoristaBean motoristaBean;
mkaule

Alguém, plis ? o0’

Rodrigo_Sasaki

Mostre o método que você usa para persistir isso.

mkaule
public String salvar(){
		
		this.motoristas =  this.motoristaManagedBean.getMotoristaDAO().findAll();
		for (MotoristaBean motorista : motoristas) {
			this.veiculoMotoristaPK.setMotoristaBean(motorista);
		}
		this.veiculos = this.veiculoManagedBean.getVeiculoDAO().findAll();
		for (VeiculoBean veiculo : veiculos) {
			this.veiculoMotoristaPK.setVeiculoBean(veiculo);
		}
		this.veiculoMotorista.setChaveComposta(this.veiculoMotoristaPK);
		this.veiculoMotoristaDAO.save(this.veiculoMotorista);
				
		
		return "index";
	}

Vamos as considerações: O método acima foi uma forma que encontrei até o momento, é eu sei está ridículo e nem um pouco orientado a objeto, nem mesmo seguindo as boas práticas. Mas o que acontece é que, a anotation @Cascade não estava funcionando. E eu tinha que setar o objeto na minha chave composta, ou então tome erro de Transient na cara.

Sugestões ?

Rodrigo_Sasaki

Ele está dizendo que seu MotoristaBean está transiente, e seu método (por mais estranho que seja) deveria funcionar, pois você está buscando o MotoristaBean diretamente do banco.

Essa lista de motoristas é populada com algo? ou o método do DAO não retorna nada?

mkaule

Agora está funcionando!
Mas parece meio tosco esse método.
Essa seria a melhor opção?

Rodrigo_Sasaki

Bom, seu método não faz muito sentido, pois você busca uma lista de motoristas, e itera ela.

A cada iteração você substitui o valor da sua variável de instância, logo, nela ficará atribuída o último registro dessa sua lista.

O ideal seria você sabe qual motorista é o correto (não sei como isso está sendo feito na sua view), e na hora de persistir, caso o objeto esteja transiente, usar métodos que buscarão diretamente quem você quer, como o find, ou o getReference da classe EntityManager, isso é, se estiver usando EntityManager.

Segue um post muito bom sobre JPA, com dicas práticas e uma explicação fácil.

JPA Consultas e Dicas, que é do blog do jakefrog.

Ainda assim, como você parece não ter muita experiência no assunto, sugiro que leia a documentação JPA/Hibernate. Ou buscar bons livros a respeito disso.

Criado 1 de junho de 2012
Ultima resposta 9 de jun. de 2012
Respostas 7
Participantes 2