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<Transporte> list = deposito.getTransportes();
Transporte transporte = new Transporte();
List<Armazenamentos> list = transporte.getArmazenamentos();
List<Depositos> 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<CreasAtividadeInstitucional> 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<CreasAtividadeInstitucional> 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.