Dúvida com mapeamento 1-n no JPA

2 respostas
R

Olá galera,
tenho dois mapeamentos 1-n unidos por uma tabela intermediária.

Meu problema está quando vou salvar um objeto da tabela intermediária.Acho que não estou sabendo usar o “cascade” direito.

Se na tabela intermediária eu não usar cascade retorna o seguinte erro: object references an unsaved transient instance - save the transient instance before flushing

Por outro lado,se eu usar Cascade.ALL,o objeto “filho” é salvo,mas um novo ‘pai’ é criado(mesmo q eu dê um filho.setPai(pai)).

Segue código:

@OneToMany(mappedBy="creas", cascade=CascadeType.ALL)
List<CreasAtividadeInstitucional> creasAtividadesInstitucionais;

@ManyToOne
@JoinColumn(name="creas_id" )
Creas creas;

O que pode estar errado?
Grato.

2 Respostas

ddduran

Bom tava de passagem pelo forum e vi teu post, então vamos la
Então faz isso mesmo

filho.setPai(pai)).

é sempre bom;

Ai quando tenho esse problema sempre faço assim: verifica se todas as classes envolvidas e que vai ser persistidas não tem nenhum atributo detached
se tiver salva eles primeiro (torna managed) ou coloca cascade

e por ultimo, você não ta colocando nenhum valor pro id desse pai não ne?

tipo um

private long id = 0;

q deveria ser algo

private Long id; // com valor null mesmo pq ai teu ORM vai saber q é um cara novo mesmo

espero q ajude

R

Ainda nada…

Baseado em alguns exemplos que vi na net,mas estou tendo o seguinte erro ao subir o servidor:

mappedBy reference an unknown target entity property: entity.CreasAtividadeInstitucional.pk.atividade in entity.AtividadeInstitucional.creasAtividadesInstitucionais

Alguma idéia do q pode ser?
Segue códigos.

Creas:

@OneToMany(mappedBy="pk.creas", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
List<CreasAtividadeInstitucional> creasAtividadesInstitucionais;

AtividadeInstitucional:

@OneToMany(mappedBy="pk.atividade", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
List<CreasAtividadeInstitucional> creasAtividadesInstitucionais;

CreasAtividadeInstitucional:

@Entity
@Table(name="tb_creas_atividade_institucional")
@AssociationOverrides(
		{   @AssociationOverride(name = "pk.atividade", joinColumns = @JoinColumn(name = "atividade_id")),
			@AssociationOverride(name = "pk.creas", joinColumns = @JoinColumn(name = "creas_id")) })
			public class CreasAtividadeInstitucional {

@EmbeddedId
private CreasAtividadePK pk = new CreasAtividadePK();

@Transient
	public AtividadeInstitucional getAtividade() {
		return this.getPk().getAtividade();
	}

	@Transient
	public Creas getCreas() {
		return this.getPk().getCreas();
	}

//getters e setters,equals,hashcode...

CreasAtividadePK:

@Embeddable
public class CreasAtividadePK {
	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private Creas creas;
	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private AtividadeInstitucional atividade;
Criado 26 de agosto de 2010
Ultima resposta 27 de ago. de 2010
Respostas 2
Participantes 2