Problema com mapeamento ManyToMany com colunas extras

Pessoal estou tentando realizar uma mapeamento entre duas entidades com colunas extras. Entretanto não estou tendo muito sucesso com o mesmo
pois quando tento rodar a aplicação o sistema me dá um erro de stackOverflow null. Até o momento não consequi solucionar o problema venho
seguindo alguns tutoriais mais sem sucesso acredito que deva ser alguma particularidade que estou errando por isso venho aqui pedi ajuda de vcs. Alguém pode me passar
algum material ou até mesmo algum toque que possam me dar para resolver o problema. Agradeço a ajuda. Estou mandando o código de mapeamento que estou fazendo
pra que alguém de vocês possam olhar.

Entidade Operadora que se relaciona com a entidade Rota

@Entity
@Table (name="operadora")
public class Operadora {

	@Id
	@GeneratedValue (strategy = GenerationType.IDENTITY)
	private long idOperadora;
	
	@Column (length=20)
	@NotNull
	private String descricao;
	
	@OneToMany(mappedBy="operadora", cascade=CascadeType.ALL)
	private Collection<Mensagem> listaMensagens;
	
	@NotNull
	private boolean ativo;
	
	@OneToMany(fetch = FetchType.LAZY,
	 mappedBy = "pk.aluno",
	 cascade = { CascadeType.PERSIST, CascadeType.MERGE })
	 @Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
	 org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
	private Collection<OperadoraRota>listaOperadoraRotas;
	
}

Entidade Rota

@Entity
@Table(name = "rota")
public class Rota {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="idRota")
	private long idRota;

	@Column(length = 50)
	@NotNull
	private String descricao;

	@Column(length = 20)
	@NotNull
	private String login;

	@Column(length = 20)
	@NotNull
	private String senha;

	@Column(length = 50)
	@NotNull
	private String endereco;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.rota", cascade = {
	CascadeType.PERSIST, CascadeType.MERGE })
	@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
	org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
	private Collection<OperadoraRota> listaOperadoraRotas;

}

A seguir duas Classe intermediárias que são utilizadas para fazer a ligação entre os dois objetos e criar um terceira tabela no banco com o id das duas entidades operadora e rota e outras colunas.

[code]

@Entity
@Table(name=“operadorarota”)
@AssociationOverrides({@AssociationOverride(name=“pk.operadora”, joinColumns=@JoinColumn(name=“idOperadora”)),
@AssociationOverride (name=“pk.rota”,joinColumns=@JoinColumn(name=“idRota”))})
public class OperadoraRota {

@EmbeddedId
private OperadoraRota pk = new OperadoraRota();

@Column
private double tarifaUnidade;

@Column
private boolean rotaPadrao;

public OperadoraRota() {
}


public OperadoraRota getPk() {
	return pk;
}

public void setPk(OperadoraRota pk) {
	this.pk = pk;
}

public boolean equals(Object o) {

	if (this == o) {
		return true;
	}
	if (o == null || getClass() != o.getClass()) {

		return false;
	}

	OperadoraRota that = (OperadoraRota) o;

	if (getPk() != null ? !getPk().equals(that.getPk())
			: that.getPk() != null) {
		return false;
	}

	return true;

}

@Transient
public Operadora getOperadora() {

	return this.getPk().getOperadora();
}

@Transient
public Rota getRota() {

	return this.getPk().getRota();

}

public int hasCode() {

	return (getPk() != null ? getPk().hasCode() : 0);

}

}[/code]


public class OperadoraRotaPk implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private Operadora operadora;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private Rota rota;

	public boolean equals(Object o) {

		if (this == o)
			return true;
		if (o == null || getClass() != o.getClass())
			return false;
		if (!(o instanceof OperadoraRotaPk))
			return false;

		OperadoraRotaPk that = (OperadoraRotaPk) o;

		if (this.operadora != null ? !this.operadora.equals(that.operadora)
				: that.operadora != null)
			return false;
		if (this.rota != null ? !this.rota.equals(that.rota)
				: that.rota != null)
			return false;

		return true;
	}

	public int hashCode() {
		int result;
		result = (this.operadora != null ? this.operadora.hashCode() : 0);
		result = 31 * result + (this.rota != null ? this.rota.hashCode() : 0);
		return result;
	}
}

Implementei os métodos hashcode e equals pq me disseram que ambos são necessários para serialização.

A classe da PK não deveria ser o OperadoraRotaPK? Pois no seu está com o OperadoraRota.

public class OperadoraRota { @EmbeddedId private OperadoraRota pk = new OperadoraRota();

Vc têm algum material que me mostre como persistir usando esse tipo de relacionamento. usando Session.save.

Cara não tenho nenhum por aqui não. Nunca usei este tipo de relacionamento, você ja conseguiu resolver?

O problema de mapeamento sim, era o que vc me passou mesmo. Porém pra persistir as entidades ainda não estou consguindo vêm me apresentando erros de contraints ae to tentando ainda solucionar o problema. Se alguém puder ajudar agradeço galera e vlw fbl.lucas já é alguma coisa falta só inserir se conseguir posto a solução aqui.

Testa o seguinte, muda este mapeamento:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.rota", cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN }) private Collection<OperadoraRota> listaOperadoraRotas;
Para este, em Rota:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.rota", cascade = CascadeType.DELETE) private Collection<OperadoraRota> listaOperadoraRotas;
E este, em Operadora:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.operadora", cascade = CascadeType.DELETE) private Collection<OperadoraRota> listaOperadoraRotas;
Cria um objeto Rota e um Operadora, salva os dois, cria um objeto OperadoraRota e salva ele.
Dependendo da aplicação as vezes é bom dar um session.refresh no objeto Rota e Operadora