ManyToMany com colunas adicionais usando JPA

Senhores…

Utilizo Jpa junto com Hibernate em minha aplicação. No entanto estou precisando fazer um ManyToMany onde eu possa colocar atributos adicionais na tabela de relcionamento.
Só que não sei pq o JPA complica tanto isso.

A estrutura é a seguinte:

Depositos >> Armazenamentos << Transportes

Onde:

Um Deposito tem vários Transportes
Um Transporte tem vários Armazenamentos
Um Transporte tem vários Depositos

Um Armazenamento pertence a um Deposito
Um Armazenamento pertence a um Transporte

Desejo colocar os atributos adicionais na tabela armazenamentos. Porém além disso sejo obter depois os seguintes gets e sets:

Deposito deposito = new Deposito();
List&lt;Transporte&gt; list = deposito.getTransportes();

Transporte transporte = new Transporte();
List&lt;Armazenamentos&gt; list = transporte.getArmazenamentos();
List&lt;Depositos&gt; list = transporte.getDepositos();

Armazenamento armazenamento = new Armazenamento();
Transporte transporte = armazenamento.getTransporte()
Deposito deposito = armazenamento.getDeposito();

Essa simples coisa faz tres dias que não consigo implementar…
Se fosse em Ruby on Rails acho que com 6 linhas de código isso estaria resolvido. Porém como nem tudo são flores…

Alguem poderia me ajudar…
Fico grato.

Um exemplo que eu tenho meu projeto:


public class Creas

	@OneToMany(fetch = FetchType.LAZY,mappedBy="pk.creas", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
	@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
		org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
		List&lt;CreasAtividadeInstitucional&gt; creasAtividadesInstitucionais;
public class AtividadeInstitucional

@OneToMany(fetch = FetchType.LAZY,mappedBy="pk.atividade", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
	@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
		org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
		List&lt;CreasAtividadeInstitucional&gt; creasAtividadesInstitucionais;

A classe associativa:

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

	Long quantidade;
	
	@EmbeddedId
	private CreasAtividadeInstitucionalPK pk = new CreasAtividadeInstitucionalPK();

A PK:

@Embeddable
public class CreasAtividadeInstitucionalPK extends BasePk implements Serializable {
	
	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private AtividadeInstitucional atividade;
@MappedSuperclass
public class BasePk {
	
	private static final long serialVersionUID = 598369540020208042L;
	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private Creas creas;
	
	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private Periodo periodo;

Você, provavelmente, está pensando de maneira relacional e não OO. Veja se você mapeia uma relacionamento N:M em JPA, no banco você precisará de uma tabela extra para implementar esse relacionamento na forma de dois relacionamentos N:1 mas o JPA vai tornar isso transparênte para você, ou seja, não haverá a necessidade de você criar uma Entidade para essa tabela de resolução do relacionamento N:M. Se não há entidade para essa tabela como você poderia acessar os seus dados extras? O JPA simplesmente não permite que você acesse dados adicionais que possam estar presentes em tabelas de resolução de N:M, a maneira corréta de implementar esse relacionamento é com dois relacionamentos N:1/1:N e criando uma Entidade a mais, até porque, se você está adicionando dados à essa tabela ela passa a ter um papel no seu sistema e não é mais só um detalhe de implementação.

Uma boa fonte:http://alinhavado.wordpress.com/tutoriais/de-many-to-many-para-many-to-one-com-jpa/