Hibernate - Erro ao salvar entidade com componente "Embedded"

1 resposta
cassio

Olá pessoal,

Estou tendo um problema ao tentar salvar minhas entidades da classe Instrumento, a qual contém como atributo um objeto anotado como @Embedded. Este atributo por sua vez possui um atributo da classe UnidadeMedida anotado com @ManyToOne. O Hibernate criou a FK para UnidadeMedida corretamente na tabela de instrumentos.

Quando vou salvar um instrumento, recebo o seguinte erro:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.shh.precision.model.UnidadeMedida

Não entendi o porque disso… como vou salvar a instância transiente se a mesma não é uma nova entidade mas sim um valor “embutido” na tabela instrumento através de um FK?

Como posso consertar isso?

As classes e mapeamentos estão assim:

/** CLASSE Instrumento */
@Entity
public class Instrumento {
				
	@Embedded
	private CaracteristicasMedicao caracteristicas;
	
	//outros atributos, getters, setters, hashCode, blablabla
}

/** CLASSE UnidadeMedida */
@Entity
@SequenceGenerator(name="unidademedida_id_seq", sequenceName="unidademedida_id_seq")
public class UnidadeMedida {	
	@Id
	@GeneratedValue(generator="unidademedida_id_seq", strategy=GenerationType.SEQUENCE)
	private long id;
	@NotEmpty(message="Nome não pode ser vazio")
	private String nome;
	@NotEmpty(message="Símbolo não pode ser vazio")
	private String simbolo;
}

/** CLASSE CaracteristicasMedicao */
@Embeddable
public class CaracteristicasMedicao {
			
	@ManyToOne
	private UnidadeMedida unidade;

	//outros atributos, getters, setters, hashCode, blablabla
}

Obrigado!

1 Resposta

feliperod

Se não me engano você tem que obter uma instancia persistida do objeto OneToMany primeiro e depois setar o objeto ManyToOne nele e mandar salvar.
Isso porque o hibernate não consegue saber qual ID gerar pro objeto debaixo de um objeto não salvo ainda.

Tô na correria agora… mas resumidamente, acho que é isso aí

Abração,

Criado 3 de dezembro de 2007
Ultima resposta 5 de dez. de 2007
Respostas 1
Participantes 2