[RESOLVIDO] Mapear @manyToOne como pk com hibernate

3 respostas
B

Tenho uma tabela Modelo que possui uma pk idModelo e uma tabela modelo_ano que possui uma pk composta por Ano e fkModelo (que é a idModelo)
Como faço para mapear a fkModelo como pk na classe ModeloAno.

segue o código:

Modelo.class

@Entity
public class Modelo implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer idModelo;

	private String modelo;

	private String combustivel;

	private String codigoFipe;

	
	@OneToMany(mappedBy = "modelo", targetEntity = ModeloAno.class)
	private List<ModeloAno> listModeloAno;

	@ManyToOne
	@JoinColumn(name = "fkMarca", nullable=false)
	private Marca marca;

       //geter e setter

}

ModeloAno.class

@Table(name = "modelo_ano")
@Entity
public class ModeloAno implements Serializable {
	
	@Id
	private Integer ano;

	private Integer preco;
	
	@ManyToOne
	@JoinColumn(name = "fkModelo", referencedColumnName="idModelo")
	private Modelo modelo;

       //geter e setter
}

3 Respostas

B

Ele só entende como chave de ModeloAno o id e preciso que a fkModelo seja pk também

Segue o erro:

Exception in thread main org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.baymabruno.modelo.ModeloAno#1992]

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:191)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:144)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)

at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523)
Flavio_Almeida

Bruno, dê uma olhada em:

http://www.objectdb.com/java/jpa/entity/id#Embedded_Primary_Key_

Abraço!

B

Solução!!!

Obrigado Flávio

A solução foi criar uma classe contendo as chaves da classe AnoModelo.
Segue as classes com a solução.

Modelo.class

import java.io.Serializable;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import lombok.Getter;
import lombok.Setter;

@SuppressWarnings("serial")
@Entity
public class Modelo implements Serializable {

	@Id
	@Getter
	@Setter
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer idModelo;

	@Getter
	@Setter
	private String modelo;

	@Getter
	@Setter
	private String combustivel;

	@Getter
	@Setter
	private String codigoFipe;

	
	@OneToMany(mappedBy = "modelo", targetEntity = ModeloAno.class)
	@Getter
	@Setter
	private List<ModeloAno> listModeloAno;

	@ManyToOne
	@JoinColumn(name = "fkMarca", nullable=false)
	@Getter
	@Setter
	private Marca marca;
}

ModeloAno.class

import java.io.Serializable;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;
import br.com.baymabruno.modelo.id.ModeloAnoId;

@Table(name = "modelo_ano")
@SuppressWarnings("serial")
@Entity
public class ModeloAno implements Serializable {

	@EmbeddedId
	@Getter
	private ModeloAnoId idModeloAno = new ModeloAnoId();

	@Getter
	@Setter
	private Integer preco;

	@ManyToOne
	@JoinColumn(name = "fkModelo", referencedColumnName="idModelo", insertable = false, updatable = false)
	@Getter
	private Modelo modelo;
	
	public void setModelo(Modelo modelo){
		this.modelo = modelo;
		this.idModeloAno.setFkModelo(modelo.getIdModelo());
	}
}

ModeloAnoId.class

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

import org.hibernate.validator.NotNull;

import lombok.Getter;
import lombok.Setter;

@SuppressWarnings("serial")
@Embeddable
public class ModeloAnoId implements Serializable{

	@Getter
	@Setter
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer ano;
	
	@Getter
	@Setter
	@NotNull
	private Integer fkModelo;
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((ano == null) ? 0 : ano.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ModeloAnoId other = (ModeloAnoId) obj;
		if (ano == null) {
			if (other.ano != null)
				return false;
		} else if (!ano.equals(other.ano))
			return false;
		return true;
	}
	
}
Criado 2 de maio de 2012
Ultima resposta 3 de mai. de 2012
Respostas 3
Participantes 2