ManyToMany com colunas adicionais usando JPA

3 respostas
T

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.

3 Respostas

R

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;
D

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.

R

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

Criado 15 de dezembro de 2010
Ultima resposta 16 de dez. de 2010
Respostas 3
Participantes 3